2017-04-01 105 views
15

假設發送HTTP請求時已經建立了TCP連接,IP地址和端口是隱式知道的 - TCP連接是IP +端口。那麼,我們需要Host頭文件?這僅僅是在多個主機映射到TCP連接中隱含的IP地址的情況下才需要的嗎?什麼是http主機頭?

回答

27

host - 頭告訴網絡服務器哪個虛擬主機使用(如果設置)。您甚至可以使用幾個別名(=域和通配符域)來擁有相同的虛擬主機。在這種情況下,如果您希望根據所尋址的不同域提供不同的行爲,您仍然可以在Web應用程序中手動讀取該標題。這是可能的,因爲在你的web服務器上你可以(如果我沒有弄錯你必須)設置一個 vhost作爲默認主機。只要host標頭不匹配任何配置的虛擬主機,就會使用此默認虛擬主機。

這意味着:雖然說「多個主機」可能有點誤導:主機(尋址的機器)是相同的,真正解決IP地址是不同的域名(包括子域名),也稱爲主機名稱(但不是主機!)。

雖然不是問題的一部分,但有趣的事實是:該規範在早期導致SSL出現問題,因爲Web服務器必須提供與客戶端已解決的域相對應的證書。但是,爲了知道要使用哪個證書,Web服務器應提前知道所提供的主機名。但是,由於客戶端僅通過加密通道發送該信息(這意味着:在證書已經發送之後),服務器必須假定您瀏覽了默認主機。這意味着:每個IP地址/端口組合一個SSL安全域。

這已經克服Server Name Indication,但是,再次打破了一些隱私,作爲服務器名以純文本格式,現在轉移了,所以每個人在這方面的中間人會看到,該主機名你想連接。

雖然網絡服務器可以知道服務器名稱指示中的主機名,但host標頭並未過時,因爲服務器名稱指示信息僅用於TLS握手中。使用不安全的連接時,根本沒有服務器名稱指示,所以host標題仍然有效(必要)。

另一個有趣的事實是:即使它可能被省略,因爲只有默認的虛擬主機配置,即使它可以被省略,大多數網絡服務器(如果甚至不是所有的)都拒絕你的http請求,如果它不包含一個host-header。這意味着,在所需的最小的信息的基於HTTP(GET-)請求是含有METHODRESOURCEPROTOCOL VERSION並且至少host -header,像這樣的第一行:

GET /someresource.html HTTP/1.1 
Host: www.example.com 

您可能需要讀取MDN Documentation on the Host-Header有關更多信息,請參閱

主機頭字段必須在所有HTTP/1.1請求消息中發送。 A 400(錯誤請求)狀態碼將被髮送到任何HTTP/1.1請求 消息,該消息缺少Host頭字段或包含多個消息。

正如達雷爾米勒所說,完整的規格可以在RFC7230找到。

+2

優秀的信息 - 謝謝! – ineedhelp

1

我總是建議在嘗試瞭解HTTP標頭的含義和目的時轉至權威來源。

在一個請求中的「主機」頭域提供的主機和端口從目標URI
信息,使源服務器
資源之間區分,同時在單個服務於對多種
主機名的請求IP地址。

https://tools.ietf.org/html/rfc7230#section-5.4