我有一个自定义404错误页面和一个mod_rewrite规则。如果我访问不存在的页面,我会收到404错误页面。我的问题是,如果我从我的php页面发出404标题,它不会打开我的404页面,相反,我明白了:
Not Found
The requested URL /index.php was not found on this server.
Additionally, a 404 Not Found error was encountered while trying
to use an ErrorDocument to handle the request.
这是我的.htaccess:
RewriteEngine on
ErrorDocument 404 /errors/404.php
RewriteRule ^[A-Za-z0-9]{8}/$ /index.php
这是我从/index.php的重定向,仅当密钥不存在时才会404。 $ key是通过解析URL获得的(例如http://localhost/aKeYCoDE/):
<?php
if (!key_exists($key)){
header('HTTP/1.0 404 Not Found');
exit;
}
?>
我希望它能重定向到我的404页面。
更新:
肯定是关于我从重写的页面(/index.php)调用404的事实。如果我创建一个虚拟页面:/redirect.php,然后什么也不做,只是从那里发出404,我得到我的自定义404页面。但是,如果我为它编写mod_rewrite规则,并尝试以这种方式访问它,我会得到默认的404错误页面。
答案 0 :(得分:2)
我找到了答案 - 问题是我的假设是来自php的标题404将重定向到404页面。那是错的。 Apache服务器可以为不存在的页面发出404,但是对于存在的页面,即由php页面提供服务,404响应将发送到浏览器。
这个帖子也有类似的问题: http://www.webmasterworld.com/forum88/10955.htm
为了让php做我想做的事情(当密钥不存在时发出404),我需要从php中包含404页面:
<?php
if (!key_exists($key)){
include($_SERVER["DOCUMENT_ROOT"]."/errors/404.php");
exit;
}
?>