PHP标头404无法正常工作

时间:2011-05-06 16:12:33

标签: php .htaccess http-status-code-404

为什么这不起作用,因为未加载预设的404页面:

header("HTTP/1.0 404 Not Found");
exit;

.htaccess设置了ErrorDocument 404 /404.html指令。

谢谢。

4 个答案:

答案 0 :(得分:6)

最近我在处理PHP项目工作时遇到了同样的问题。

发送标题本质上只是一个“状态消息”,并不会使浏览器或服务器显示特定页面(尽管我相信某些旧版本的IE 可能显示其默认的404页面)。 这意味着您需要在脚本中创建自己的404错误消息,因为.htaccess错误处理不起作用。

我的建议是使用

的内容
header("HTTP/1.0 404 Not Found");
include('./404.html');
exit;

我知道这看起来很愚蠢,但到目前为止,这是我发现的唯一方法。

答案 1 :(得分:5)

确保您的自定义错误页/404.html的内容大小超过512字节。如果自定义404页面的内容长度小于512,则许多浏览器(如IE,Chrome等)都不会显示您的自定义页面。

更新

根据您的评论,我认为这是正在发生的事情。

如果您查看此空白页面的Firebug / HTTP Watch等中的access.log或http标头,您将看到404返回代码。一旦Web服务器开始处理PHP页面,它已经通过了它将自己处理404处理的点,因为你的php文件实际上是 FOUND 。现在,由于您的PHP代码只返回状态404 没有任何内容,因此会显示空白页面。

现在,因为这是正确的apache行为,它由你来创建404页面的内容。我认为你上面的PHP代码中的这样的东西会很好:

<?php
header("HTTP/1.0 404 Not Found");
exit("<h1>Not Found</h1>
The requested URL " . $_SERVER["REQUEST_URI"] . " was not found on this server.
<hr>");
?>

答案 2 :(得分:0)

这很可能是因为Apache已经将初始请求传递给PHP页面来处理。很可能是因为您有一个有效的前端控制器实现,并将所有Web请求重定向到此页面。这使得404s对您的应用程序负责,并显示适当的404页面。

答案 3 :(得分:0)

我注意到它不起作用,所以我用静态方法创建了一个类来解决问题

我有一个目录/error-pages,我在其中存储所有错误文件

我有一个课程文件error.php,可以将其放在每个页面的顶部

class ServerError{
    public static function show($page){
        require $_SERVER['DOCUMENT_ROOT'].'/error-pages/'.$page.'.php';
        exit();
    }
}

例如,在您的home.php页上,您说

if (my404IsTrue) {
    ServerError::show("404");
}

这样。您可以将其用于其他任何类型的错误,无论是403还是自定义错误

希望有帮助