PHP标头404不起作用

Posted

技术标签:

【中文标题】PHP标头404不起作用【英文标题】:PHP header 404 not working 【发布时间】:2011-08-20 07:47:00 【问题描述】:

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

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

.htaccess 具有 ErrorDocument 404 /404.html 指令集。 谢谢。

【问题讨论】:

【参考方案1】:

不幸的是,我最近在工作 php 项目时遇到了同样的问题。

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

我的建议是使用类似的东西

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

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

【讨论】:

嗨,Sunny,如果一切都失败了,我会试一试,但这似乎很愚蠢。我已经告诉浏览器该页面不存在,它也是输出的第一行。【参考方案2】:

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

更新

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

如果您查看此空白页面的 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>");
?>

【讨论】:

嗯,我想获得默认的 404 错误,而不是初学者的自定义错误。 如果您在 .htaccess 中有 ErrorDocument 404 /404.html 指令,那么这是否意味着您正在尝试为 404 错误显示 404.html 哈哈,对不起。我忘了告诉你现在已经被注释掉了。 这正是我一直在寻找的东西,让我发疯,因为我期待 httpd 能够整理出要显示的 404。我什至没有想到 php 输出代码和页面 html。谢谢!【参考方案3】:

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

【讨论】:

没错,所有流量都被重定向到这个页面 - 这是一个带有友好 URL 的 SEO 事情。【参考方案4】:

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

我有一个目录/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 还是自定义错误

希望对你有帮助

【讨论】:

以上是关于PHP标头404不起作用的主要内容,如果未能解决你的问题,请参考以下文章

标头位置在 PHP 中不起作用 [重复]

PHP标头重定向不起作用并停留在login.php上

由于浏览器缓存,PHP 标头 301 重定向不起作用

为啥是我的标头(“位置:$_SERVER['HTTP_REFERER']”); PHP函数不起作用?

show_404() 中的自定义视图不起作用

基于 header(location) 命令重定向 php 页面不起作用;标头已发送错误[重复]