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

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

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

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

谢谢。

【问题讨论】:

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


    【解决方案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 还是自定义错误

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-30
      • 2017-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多