自定义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') ?> © 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
相关产品推荐
相关产品推荐

