Php

Nginx 忽略客戶端的 HTTP 1.0 請求並通過 HTTP 1.1 響應

  • September 2, 2013

我正在使用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

如您所見,我已經在請求 using HTTP 1.0,但 nginx 回复我HTTP 1.1

賞金

@MaximDounin,@MichaelHampton 已經提供了規範的答案,謝謝。我為未來的讀者稍微擴展了這個問題:

問:當客戶端請求 HTTP 1.0 時響應 HTTP 1.1 有什麼好處?Google 採取的方法不應該更合理,即當客戶端請求 1.0 時,以 1.0 響應?

根據 RFC 2616,這是正常和預期的行為:

至少有條件地符合本規範的應用程序應該在其消息中使用“HTTP/1.1”的 HTTP 版本,並且必須對任何與 HTTP/1.0 不兼容的消息這樣做。有關何時發送特定 HTTP-Version 值的更多詳細資訊,請參閱 RFC 2145。

RFC 2145 對此進行了擴展

HTTP 伺服器應該發送一個響應版本,該版本等於伺服器至少有條件地兼容的最高版本,並且其主要版本小於或等於請求中收到的版本。HTTP 伺服器絕不能發送它不至少有條件地兼容的版本。如果無法使用客戶端請求中使用的主要版本發送響應,伺服器可以發送 505(不支持 HTTP 版本)響應。

如果知道或懷疑客戶端錯誤地實現了 HTTP 規範,HTTP 伺服器可以發送較低的響應版本,但這不應該是預設值,如果請求版本是 HTTP/1.1 或更高版本,則不應該這樣做。

這在英語中的意思是:如果客戶端發送 HTTP/1.0 請求,則 HTTP/1.0 響應或 HTTP/1.1 都可以接受,但首選 HTTP/1.1。

這樣做的原因是為了讓一端可以宣傳它可以支持的最高版本的 HTTP,以便另一端可以選擇升級它的協議支持(如果可能的話)。然後,兩端將決定他們都可以使用的協議版本。正如 RFC 2145 所述,這種設計還有助於處理有缺陷的實現。

當時還設想 HTTP 協議可能會有更多版本,包括次要版本和主要版本,這些規則旨在幫助確保互操作性。一旦HTTP/2.0最終確定, Google 的 RFC-ignorant 方法可能會中斷。(你知道它的草稿形式為SPDY。)

引用自:https://serverfault.com/questions/442960