Nginx 忽略客戶端的 HTTP 1.0 請求並通過 HTTP 1.1 響應
我正在使用
nginx/php5-fpm
程式碼進行測試<?php header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found"); // also tested: header("Status: 404 Not Found"); echo $_SERVER["SERVER_PROTOCOL"];
並通過命令強制使用HTTP 1.0
curl
。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。
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。)