【问题标题】:When to send HTTP status code?何时发送 HTTP 状态码?
【发布时间】:2009-05-04 07:48:02
【问题描述】:

目前在我的 PHP 脚本中,当用户尝试访问不存在或不属于该用户的内容时,我会将用户重定向到自定义的 404 未找到错误页面。像这样:

header('Location: http://www.mydomain.com/error/notfound/');
exit;

我意识到上面的 header() 调用默认发送一个 302 重定向状态码。

然而,我不明白什么时候应该发送 404 not found 状态码。在我重定向用户之前?或者当我显示 /error/notfound/ 页面时?

感谢您的帮助!

【问题讨论】:

    标签: php http header http-headers


    【解决方案1】:

    你应该这样做:

    header("HTTP/1.0 404 Not Found");
    include 'error.php';
    die();
    

    【讨论】:

    • 如果浏览器使用 HTTP/1.1 进行连接会发生什么? php 是否强制使用 mod_php 的 apache 发回 HTTP/1.1 响应???
    【解决方案2】:

    您根本不会将 404 错误作为重定向执行。

    您真正想做的是发送 404 状态标头,然后将当前输出替换为 404 页面的正文。

    有多种方法可以做到这一点,这在很大程度上取决于您网站的结构。 MVC 应用程序通常使用转发来处理它。我见过其他系统抛出异常,然后注册的异常处理程序负责显示 404 页面。

    无论如何,粗略的步骤是

    1. 确定内容无效
    2. 退出当前执行
    3. 清除任何输出,如果有的话。
    4. 发送 404 状态标头
    5. 发送404页面的内容

    【讨论】:

    • +1 很好地解释了。特别是提到 404 错误不是作为重定向执行的,我认为这很重要。
    【解决方案3】:

    您不能同时使用 404 和 Location:。位置仅对某些响应(201 和 3xx)有效

    但是,您可以将自定义 HTML 页面作为 404 响应的正文发送。

    【讨论】:

      【解决方案4】:

      来自 php.net:

      有两种特殊情况的标头调用。第一个是以字符串“HTTP/”(大小写不重要)开头的标头,它将用于确定要发送的 HTTP 状态代码。例如,如果您已将 Apache 配置为使用 PHP 脚本来处理丢失文件的请求(使用 ErrorDocument 指令),您可能希望确保您的脚本生成正确的状态代码。

      <?php
      header("HTTP/1.0 404 Not Found");
      ?>
      

      http://us.php.net/manual/en/function.header.php

      【讨论】:

        【解决方案5】:

        您应该发送一个 404 HTTP 状态代码。浏览器和crawlers 理解这一点。您可能还希望包含一个更友好的错误页面来解释发生了什么,包括用于搜索您的网站的表单、Soundex 链接等。

        【讨论】:

          【解决方案6】:

          “重定向”和“未找到”是不同的概念。

          可以找到哪个文件?
          http://www.mydomain.com/error/notfound/

          http://www.mydomain.com/not_exist.html

          http://www.mydomain.com/not_exist.html”页面应该有 404 标头和“页面未找到”内容。

          快速修复可能是:

          header("HTTP/1.0 404 Not Found");
          readfile('http://www.mydomain.com/error/notfound/');
          exit;
          

          但这需要 2 个 apache 请求,有点讨厌。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-03-06
            • 1970-01-01
            • 2017-01-24
            • 2018-05-07
            • 2018-05-17
            • 1970-01-01
            • 2012-12-04
            • 1970-01-01
            相关资源
            最近更新 更多