我正在尝试在数据库结果为空(这是产品页面)时发送两者。
我现在使用的代码,有效:
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。
感谢。
答案 0 :(得分:5)
你不能同时发送它们,因为它们是互斥的。
第二个特例是“Location:”标题。不仅如此 将此标头发送回浏览器,但它也会返回REDIRECT (302)状态代码到浏览器,除非201或3xx状态代码 已经确定了。
所以发送两者都是胡说八道。您要对浏览器说“该文档不存在。此外,文档已移至以下位置”。这些都是矛盾的。
您找到的解决方案不是“解决方法” - 这是正确的方法吗?
答案 1 :(得分:1)
后一个代码不起作用,因为404.html实际上存在于服务器上。您正在发送404状态代码,然后重定向到现有页面,从而生成200(找到)状态代码。
答案 2 :(得分:0)
在PHP 5.1.6中,我碰巧在我的测试机器上header()
命令的顺序决定了返回哪个状态。因此,如果在Location:
header("Location: ...");
header("HTTP/1.1 404 Not Found");