使用PHP发送正确的HTTP 404头

使用PHP发送正确的HTTP 404头,php,http,Php,Http,可能重复: 我有一个简单的PHP代码,它使用头发送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 &l

可能重复:

我有一个简单的PHP代码,它使用
头发送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
curl-0-v'http://www.example.com/test.php'
>GET/test.php HTTP/1.0
未找到
正如您所看到的,
$\u SERVER[“SERVER\u PROTOCOL”]
是1.0,但是header给我
1.1
,原因是什么?

如果您在nginx和PHP之间使用FastCGI(您可能是),那么您应该改为使用

header("Status: 404 Not Found");
根据。

的建议,这是一个很好的问题

您必须理解,这不是PHP特有的东西,所以不要认为存在bug或其他东西。具体到:

  • web服务器的配置
  • 客户端(想想浏览器)的配置
  • 通常,客户端在向web服务器发送请求时,会指示它们支持哪种协议。然后,web服务器使用其支持的或配置为的协议进行响应

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

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


    也许您应该编辑您的问题,或者打开一个新的问题,以便更具体地针对nginx,因为正如我解释的,这不是PHP的问题。这样,更多的人可以找到问题并提供帮助。

    @Gordon,如果你说它是重复的,请仔细阅读。是的,我已经尝试过,仍然使用1.1
    $\u服务器[“服务器协议”]
    只是发送请求时使用的协议版本,而不一定是发送响应时使用的协议版本。使用该标题应适当设置404。我使用的是nginx/php5 fpm,问题是当客户告诉他们只支持1.0时,使用1.1响应仍然有意义?@Yoga是的,我刚刚意识到,从您发布的响应标题中可以清楚地看出,您使用的是nginx。很抱歉:)。无论如何,有关详细信息,请参见我的编辑。我的
    curl
    命令已指定我只想与
    http 1.0
    聊天,我也同意这是
    nginx
    的问题,然后我将在serverfault中报告。谢谢