apache mod_rewrite和404页面的问题

时间:2011-09-25 16:46:35

标签: php apache .htaccess

我有一个自定义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错误页面。

1 个答案:

答案 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;
}
?>