【问题标题】:Can't seem to send 404 and Location headers together似乎无法同时发送 404 和 Location 标头
【发布时间】:2012-05-15 00:57:21
【问题描述】:

当数据库结果为空时(它是产品页面),我尝试同时发送两者。

我现在使用的代码,有效:

    header("Status: 404 Not Found");
    include_once("404.html");
    exit;

我最初尝试的代码不起作用:

    header("Status: 404 Not Found");
    header("Location: 404.html");
    exit;

对于后面的代码,我可以使用其中的任何一个,但不能同时使用两者。换句话说,我可以发送 404 标头并看到它显示在 Wireshark 中,或者我可以发送 Location 标头并重定向,但如果我尝试同时发送两者,则只会发送 404 并且 Location 标头不会重定向。

我已经用一个可行的解决方案解决了问题,但我想知道为什么会这样。

带有 FastCGI 的 Linux 上的 PHP 5.2。

谢谢。

【问题讨论】:

  • Redirect 404 or just 404 header 的可能副本 另请参阅:Is a “404 redirect” a legitimate redirect? 基本上,当您真的发送 404 响应时(尽管它可以完成)是没有意义的意味着重定向(顺便说一句,这对用户来说非常烦人,因为他们无法弄清楚他们错误输入了哪个 URL)。
  • 我认为这是对 404 的合法使用。URL 示例是 http://domain.com/goodproduct 会自然发送 200,但如果输入的是旧的或无效的产品 ID, http://domain.com/nonexistentproduct,我想发送 404 并重定向到现有的 404 页面。我正在使用 mod_rewrite 在 PHP 文件上发送 GET 参数,除非存在目录,在这种情况下会改为提供。
  • 据我了解,如果页面不存在,404是正确的。如果它曾经存在于当前 URL 但移动到其他地方,则 301 是正确的状态代码。如果它在某个时候确实存在但不再存在,那么 410 (Gone) 可能是合适的。在任何情况下,您都可以显示任何您想要的。您遇到此问题的事实是否表明您可能滥用标头?
  • 如果您在上面查看我要完成的工作,我认为我没有滥用它们,我只是想弄清楚为什么我不能发送 404 然后使用 Location标头并重定向页面。正如我所提到的,无论我将它放在代码中 404 标头的上方还是下方,Location 标头都会被忽略。我想发送 404 的原因是,如果产品不再存在或需要从网站(但不是从数据库中)删除,我想发送 404 告诉搜索引擎端的每个人它是消失并为人类显示 404 页面。

标签: php header http-headers http-status-code-404


【解决方案1】:

您不能同时发送两者,因为它们是互斥的。

根据docs for header()

第二种特殊情况是“Location:”标头。不仅如此 将此标头发送回浏览器,但它也返回一个 REDIRECT (302) 状态码到浏览器,除非是 201 或 3xx 状态码 已经设置好了。

所以发送两者都是无稽之谈。您会对浏览器说,“该文档不存在。此外,该文档已移至以下位置”。这些是矛盾的。

您找到的解决方案不是“解决方法”——它是正确的方法™

【讨论】:

    【解决方案2】:

    后一个代码不起作用,因为 404.html 实际上存在于服务器上。您正在发送 404 状态代码,然后重定向到现有页面,从而产生 200(已找到)状态代码。

    【讨论】:

    • 对吗?当我尝试后一个代码时,当我使用 Wireshark 观看 HTTP 时,我确实看到了 404:HTTP 279 HTTP/1.1 404 Not Found
    【解决方案3】:

    在 PHP 5.1.6 中,我碰巧在我的测试机器上使用header() 命令的顺序来确定返回的状态。因此,如果在 Location 之后设置状态,则可以返回 HTTP 404 以及 Location 标头:

    header("Location: ...");
    header("HTTP/1.1 404 Not Found");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-02
      • 2011-12-30
      相关资源
      最近更新 更多