似乎无法将404和Location标头一起发送

时间:2012-05-05 22:23:21

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

我正在尝试在数据库结果为空(这是产品页面)时发送两者。

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

    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。

感谢。

3 个答案:

答案 0 :(得分:5)

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

根据docs for header()

  

第二个特例是“Location:”标题。不仅如此   将此标头发送回浏览器,但它也会返回REDIRECT   (302)状态代码到浏览器,除非201或3xx状态代码   已经确定了。

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

您找到的解决方案不是“解决方法” - 这是正确的方法吗?

答案 1 :(得分:1)

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

答案 2 :(得分:0)

在PHP 5.1.6中,我碰巧在我的测试机器上header()命令的顺序决定了返回哪个状态。因此,如果在Location:

之后设置状态,则可以返回HTTP 404和Location头
header("Location: ...");
header("HTTP/1.1 404 Not Found");