You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义404错误页面无法正常显示问题排查:.htaccess配置与PHP权限控制场景

问题根源分析与解决方案

咱们一步步拆解你遇到的核心问题,再逐个给出解决办法:

1. 自定义404页面不生效的原因

你在.htaccess里配置的ErrorDocument是Apache服务器层面的错误触发规则——只有当Apache自身检测到404错误(比如请求的文件不存在)时,才会调用你的自定义页面。

但你用PHP手动发送404 Not Found头后直接die(),此时请求已经被PHP完全接管并终止,Apache没有机会介入执行ErrorDocument配置,所以只会显示Apache默认的404页面。

2. 文件引入冲突的本质

404-page.php里用的是相对路径(比如../koneksi/koneksi.php),相对路径的基准是当前执行PHP脚本的目录,而非404-page.php自身的目录。举个例子:

  • 如果权限控制代码在/admin/dashboard.php里,../koneksi/koneksi.php会被解析成/koneksi/koneksi.php
  • 但如果koneksi.php实际在/AllProject/koneksi/koneksi.php,路径就完全错了,导致引入失败。

另外,你的权限控制代码还有个逻辑bug:未登录判断放在了die()之后,永远不会执行!用户未登录时,会先触发role != ADMIN的判断并直接终止脚本,根本跳不到登录页。


解决方案

第一步:修复权限控制逻辑与404页面加载

把原来的die()改成加载自定义404页面,同时用绝对路径引入,避免路径错误:

<?php 
session_start(); // 必须先启动Session,否则$_SESSION无法读取!

// 先处理未登录的情况,优先级更高
if (!isset($_SESSION['username']) || !isset($_SESSION['role'])) {
    $containUrl = urlencode(
        (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") 
        . "://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}"
    );
    header("Location: index?destination=" . $containUrl);
    exit;
}

// 再处理权限不足的情况
if ($_SESSION['role'] !== 'ADMIN') {
    // 发送404状态码
    header($_SERVER["SERVER_PROTOCOL"] . " 404 Not Found", true, 404);
    // 用绝对路径引入404页面,确保路径正确
    require $_SERVER['DOCUMENT_ROOT'] . '/AllProject/layouts/404-page.php';
    exit;
}
?>

第二步:修复404-page.php的文件引入路径

把404-page.php里的相对路径全部改成基于网站根目录的绝对路径,用$_SERVER['DOCUMENT_ROOT']拼接:

<?php require $_SERVER['DOCUMENT_ROOT'] . '/AllProject/koneksi/koneksi.php'; ?>
<?php require $_SERVER['DOCUMENT_ROOT'] . '/AllProject/layouts/resources.php'; ?>
<body>
<!-- Page Container -->
<div class="page-container">
    <div class="error-404">
        <div class="error-bg"></div>
        <div class="error-info">
            <div class="error-text">
                <div class="error-header">
                    <h3>404</h3>
                </div>
                <div class="error-body">
                    <p>Halaman yang anda cari tidak ditemukan.<br>Klik <a href="<?= $hostToRoot ?>"> disini</a> untuk kembali. </p>
                </div>
                <div class="error-footer">
                    <p><?= date('Y') ?> &copy; ReD | Projects <?= $version ?></p>
                </div>
            </div>
        </div>
    </div>
</div><!-- /Page Container -->
<?php require $_SERVER['DOCUMENT_ROOT'] . '/AllProject/layouts/footer.php'; ?>

第三步:调整.htaccess的受限目录规则(可选)

如果你希望访问/folder时也显示自定义404,而非默认的403,把.htaccess里的这行:

RewriteRule ^folder/?$ - [F,L]

改成返回404状态码:

RewriteRule ^folder/?$ - [R=404,L]

这样Apache会触发你的ErrorDocument 404配置,显示自定义页面。


内容的提问来源于stack exchange,提问作者AnonymousUID

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.01 02:49:08