我正在使用nginx/php5-fpm
, 和代码进行测试
<?php
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
// also tested: header("Status: 404 Not Found");
echo $_SERVER["SERVER_PROTOCOL"];
并强制在命令中使用HTTP 1.0curl
。
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
如您所见,我已经在请求使用HTTP 1.0
,但 nginx 回复我HTTP 1.1
赏金
@MaximDounin,@MichaelHampton 已经提供了规范的答案,谢谢。我为未来的读者稍微扩展了这个问题:
问:当客户端请求 HTTP 1.0 时响应 HTTP 1.1 有什么好处?Google 采取的方法不应该更合理,即当客户端请求 1.0 时,响应 1.0?
根据 RFC 2616,这是正常的预期行为:
RFC 2145 对此进行了扩展:
这在英语中的意思是:如果客户端发送 HTTP/1.0 请求,则 HTTP/1.0 响应或 HTTP/1.1 都可以接受,但首选 HTTP/1.1。
这样做的原因是一端可以通告它可以支持的最高版本的 HTTP,以便另一端可以选择升级其协议支持(如果可能)。然后两端将决定他们都可以使用的协议版本。正如 RFC 2145 所述,这种设计还有助于处理有缺陷的实现。
当时还设想可能会有更多版本的 HTTP 协议,包括次要版本和主要版本,这些规则旨在帮助确保互操作性。一旦HTTP/2.0最终确定, Google 的 RFC 无知方法可能会失败。(你知道它的草稿形式是SPDY。)
它实际上是向您发送符合 HTTP/1.0 标准的响应。它不会使用任何需要 HTTP/1.1 的功能,例如 keepalive。
这样做的原因是因为它是服务器说的一种廉价方式:
(注意:如果服务器支持虚构的 HTTP/1.8,它会做出响应。)
在某些情况下,这可以为您节省额外的请求。如果您需要从服务器获取 3 个不同的 URI,您可以将第一个作为 HTTP/1.0 发送,然后升级到您和服务器都支持后续请求的最高版本。