2014-03-12 17 views
8

上週,我開始很小題大做,我計算機網絡類在需要強制性Host子句中HTTP 1.1的頭GET消息。原因在HTTP 1.1的強制性主持人的條款GET

我提供的原因,無論是寫在網上還是我的同學喊我,都是一樣的:需要支持虛擬主機。但是,我會盡可能地澄清,這似乎沒有道理。

據我所知,爲了讓兩個域名可以在一臺機器上託管(並因此共享相同的地址),必須存在區分這兩個域名的方法。

我不明白的是爲什麼這是不可能實現這一沒有一個Host條款(HTTP 1.0風格),使用絕對URL(如GET http://www.example.org/index.html),而不是一個相對(例如GET /index.html)。 當HTTP消息到達服務器時,它(服務器)會將消息重定向到相應的主機,而不是通過查看Host子句,而是通過查看URL中的主機名消息的請求行

如果你們中的任何一位鐵桿黑客能夠幫助我理解我在這裏錯過了什麼,我將不勝感激。

+2

像在GET請求中那樣發佈完整的絕對URL是代理服務器如何工作的。現在,代理服務器無法知道它是否應該代理該請求,或者它是否是對某些本地資源的格式錯誤的請求。 –

+1

那麼這不是馬克的觀點,他們當時並沒有因此而計劃。 –

回答

5

這在this thread討論:

爲HTTP/2.0與他們的理由適度的建議。

  1. 向客戶端請求添加一個標頭,該標頭指示客戶端正在訪問的URL的主機名和端口號 。

理由:其中最需要的功能從商業服務器 維護者是一個單端口 上運行一臺服務器,並把它與根據在URL中 主機名不同的頂級網頁的響應能力。

製作絕對請求的URI需要(因爲有沒有辦法讓客戶知道服務器上的房屋的一個或多個網站事前是否)是suggested

重的第一個建議,以納入主機名在某處。這 將乾淨放入URL本身: -

GET http://hostname/fred http/2.0 

這是語法代理重定向。

爲了這this論點提出:

自會有客戶的混合,一些配套的主機名報告 ,有些不是,它只是無關緊要這個信息是如何獲取到服務器。 由於無關緊要,實施更簡單的解決方案是一個新的HTTP 請求標頭字段。它允許所有客戶端和服務器在 現在進行操作時無需更改代碼。實際上需要主機 名稱信息的客戶端和服務器可以使用小型mod來發送包含URL並處理它的額外頭字段 。

[...]

所有我的建議是,有以 一種更好的方式實現服務器交付的主機名信息,不涉及 黑客的請求,語法和可向後兼容所有客戶端 和服務器。

隨時閱讀以發現最終決定自己。但要注意,在那裏迷路很容易。

0

「主機」標頭的原因是爲了明確此請求引用哪個主機。如果沒有'主機',服務器必須提前知道它應該將'http://joesdogs.com/'路由到喬的狗,而它應該將'http://joscats.com/'路由到喬的貓,即使它們在同一個網絡服務器上。 (如果一個服務器有兩個名字,比如'joscats.com'和'joescats.com'應該指向同一個網站呢?)

有一個明確的'主機'頭部使得這些類型的決定更容易編程。

+3

我認爲這個問題是「爲什麼他們沒有在HTTP 1.1中提供絕對的URI,而不是添加主機頭」_。 – CodeCaster

0

在HTTP請求中添加對指定主機的支持的原因是IP地址有限的供應(當HTTP 1.0出來時,這還沒有問題)。

如果您的問題是「爲什麼在主機頭中指定主機而不是在請求線」,則答案是需要HTTP/1.0和1.1之間的互操作性。

如果問題是「爲什麼Host標頭強制爲」,這與加速從分配的IP地址轉換的意圖有關。

以下是關於HTTP/1.1的Internet address conservation的一些背景知識。

相關問題