使用PHP发送正确的HTTP 404标头

时间:2012-10-27 09:14:04

标签: php http

  

可能重复:
  404 header - HTTP 1.0 or 1.1?

我有一个简单的PHP代码,使用header

发送404
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found"); 
echo $_SERVER["SERVER_PROTOCOL"];

但是当使用curl命令并强制1.0时,它会返回..

curl -0 -v 'http://www.example.com/test.php'


> GET /test.php HTTP/1.0

< HTTP/1.1 404 Not Found
< Server: nginx
< Date: Sat, 27 Oct 2012 08:51:27 GMT
< Content-Type: text/html
< Connection: close
< 
* Closing connection #0
HTTP/1.0

正如您所看到的,$_SERVER["SERVER_PROTOCOL"]为1.0,但标题为1.1,原因是什么?

2 个答案:

答案 0 :(得分:1)

很棒的问题。

你必须明白这不是PHP特有的东西,所以不要认为有bug或什么的。具体到:

  1. 网络服务器的配置
  2. 客户端(思考浏览器)配置
  3. 通常,客户端在向Web服务器发送请求时会指出它们支持的协议。然后,Web服务器使用它支持的协议进行响应,或者将其配置为。

    在您的PHP代码中,当您刷新404标头时,您暗示服务器使用哪种协议。你不能强迫它 - 至少我不知道从PHP强制它的方法。 Web服务器最终将满足自身和请求客户端支持的最高协议。

    除非客户端强制执行,否则nginx将始终通过HTTP / 1.1进行响应。我不知道像Apache这样配置它的方法。但这就是你所看到的行为的原因。

    也许你应该编辑你的问题,或者打开一个新的问题,以便更加特定于nginx,因为我解释过这不是PHP的问题。这样,更多的人可能能够找到问题并提供帮助。

答案 1 :(得分:-1)

如果你在nginx和PHP之间使用FastCGI(你可能是),你应该使用

header("Status: 404 Not Found");

根据PHP's documentation for header的建议。