5

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

我现在使用的代码有效:

    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。

谢谢。

4

3 回答 3

6

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

根据header() 的文档

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

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

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

于 2012-05-05T23:00:32.223 回答
1

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

于 2012-05-05T22:27:36.610 回答
0

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

header("Location: ...");
header("HTTP/1.1 404 Not Found");
于 2013-10-10T11:52:39.897 回答