Nginx忽略客户端的HTTP 1.0请求,并通过HTTP 1.1进行响应

我正在使用nginx/php5-fpm与代码进行testing

 <?php header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found"); // also tested: header("Status: 404 Not Found"); echo $_SERVER["SERVER_PROTOCOL"]; 

并强制使用curl命令使用HTTP 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 

正如你所看到的,我已经在请求使用HTTP 1.0 ,但是nginx以HTTP 1.1回复我

赏金

@MaximDounin,@MichaelHampton已经提供了规范的答案,谢谢。 我将这个问题稍微扩展到未来的读者:

问:当客户端请求HTTP 1.0时,响应HTTP 1.1的优点是什么? Google不应该采取更合理的做法,即客户端请求1.0时,是否回应1.0?

根据RFC 2616 ,这是正常和预期的行为:

至less有条件地符合本规范的应用程序应该在它们的消息中使用HTTP-1.1版本,并且对于任何与HTTP / 1.0不兼容的消息必须这样做。 有关何时发送特定HTTP版本值的更多详细信息,请参阅RFC 2145。

RFC 2145对此进行了扩展 :

HTTP服务器应该发送一个响应版本,该响应版本等于服务器至less符合条件的最高版本,其主要版本小于或等于请求中收到的版本。 HTTP服务器不能发送一个至less不符合条件的版本。 如果无法使用客户端请求中使用的主要版本发送响应,服务器可能会发送505(HTTP版本不支持)响应。

如果HTTP服务器已知或怀疑客户端错误地实现了HTTP规范,HTTP服务器可能会发送较低的响应版本,但是这不应该是默认的,并且如果请求版本是HTTP / 1.1或更高版本,则不应该这样做。

英文意思是:如果客户端发送HTTP / 1.0请求,HTTP / 1.0响应或HTTP / 1.1都可以接受,但HTTP / 1.1是首选。

这样做的原因是为了使一端可以通告它可以支持的最高版本的HTTP,以便另一端可以select升级它的协议支持(如果可能的话)。 两端将决定他们可以同时使用的协议版本。 正如RFC 2145所述,这种devise也有助于处理错误的实现。

当时也有人设想,可能会有更多版本的HTTP协议,包括次要版本和主要版本,规则都是为了确保互操作性。 一旦HTTP / 2.0完成,Google的RFC无知方法可能会中断。 (你的草稿forms是SPDY 。)

问:当客户端请求HTTP 1.0时,响应HTTP 1.1的优点是什么?

它实际上是向你发送一个HTTP / 1.0兼容的响应。 它不会使用任何需要HTTP / 1.1的Keepalivefunction。

这样做的原因是因为这是服务器的一个便宜的方式说:

“嘿,我知道你给我发了一个使用HTTP / 1.0的请求,但是只是为了让你知道我能够使用HTTP / 1.1 ,这里是对原始请求的响应: [..]

(注意:如果服务器支持一个虚构的HTTP / 1.8,它会回应。)

这在某些情况下为您节省了额外的请求。 如果您需要从服务器获取3个不同的URI,则可以将第一个URI作为HTTP / 1.0发送,然后移动到您和服务器为后续请求支持的最高版本。