【问题标题】:Sending correct HTTP 404 header using PHP [duplicate]使用 PHP 发送正确的 HTTP 404 标头 [重复]
【发布时间】:2012-10-27 19:00:59
【问题描述】:

可能重复:
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,这是什么原因?

【问题讨论】:

  • @Gordon,当你说它是重复的时候,请仔细阅读。

标签: php http


【解决方案1】:

好问题。

你必须明白这不是 PHP 特有的,所以不要认为有错误或什么。它特定于:

  1. Web 服务器的配置
  2. 客户端(想想浏览器)配置

通常,客户端在向 Web 服务器发送请求时,会指明它们支持的协议。然后,Web 服务器会使用它支持或配置的协议进行响应。

在您的 PHP 代码中,当您刷新该 404 标头时,您是在向服务器提示要使用哪个协议。你不能强迫它——至少我不知道有一种方法可以从 PHP 中强制它。 Web 服务器最终会选择其自身和请求客户端都支持的最高协议。

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

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

【讨论】:

  • 我使用的是 nginx/php5-fpm,问题是当客户端告诉他们只支持 1.0 时,用 1.1 响应仍然有意义吗?
  • @Yoga 是的,我刚刚意识到从您发布的响应标头中可以清楚地看出您正在使用 nginx。对于那个很抱歉 :)。无论如何,请参阅我的编辑了解详细信息。
  • 我的curl命令已经指定我只想和http 1.0聊天,我也同意是nginx的问题,然后我会在serverfault报告。谢谢。
【解决方案2】:

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

header("Status: 404 Not Found");

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

【讨论】:

  • 是的,我试过了,还是用 1.1 回复
  • $_SERVER["SERVER_PROTOCOL"] 只是发送请求的协议版本,不一定是发送响应的协议版本。使用该标头应该适当地设置您的 404。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-17
  • 2017-12-20
  • 2018-04-29
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多