2011-05-14 19 views
9

根據定義HTTP/1.1的RFC 2616Host:頭是強制性的。HTTP Host頭何時可以未定義?

客戶端必須在所有HTTP/1.1請求消息中包含主機頭字段。

但是,PHP manual意味着它可能是空的:

「HTTP_HOST」:主機的內容:從目前的請求頭,如果有一個。

在哪種情況下,此標題,因此$_SERVER['HTTP_HOST']是空的?我的應用程序能否依賴它的存在?

+0

根據[HTTPbis]('http://tools.ietf.org/html/draft-ietf-httpbis-p1-messaging-14#appendix-B.1.1)'Host:'頭仍然是'強制' ,但這並不意味着它將永遠存在。 Apache優雅地處理它的缺席(儘管它不會到達任何配置的虛擬主機)。 – mario 2011-05-14 20:40:54

+0

@mario:野外有沒有發送「Host:」頭的實際HTTP/1.1客戶端? – Tim 2011-05-14 20:43:54

+2

我不認爲他們是真正的客戶,當然也沒有當代的瀏覽器和庫。但是任何手工製作的PHP腳本都可能。但是,它仍然是一個配置問題,與Apache虛擬主機無關。 HTTP_HOST由Apache預先篩選,我不擔心它在實踐中是空的。不太可能的邊緣情況。 – mario 2011-05-14 20:52:29

回答

13

它可以在HTTP 1.0中爲空。如果沒有指定主機頭,虛擬主機根本無法工作,因此將使用Web服務器中的默認虛擬主機。

我剛剛自己測試過;在Nginx下的PHP中,$_SERVER['HTTP_HOST']變量被設置爲虛擬主機的名稱,在我的情況下爲_。但是這也取決於你在Nginx中的fastcgi_params配置。

在共享主機上,這並不重要,因爲默認的虛擬主機將被設置爲託管公司的某些信息頁面,因此您的腳本將不會運行。儘管爲自己的服務器記住可能是件好事。

+0

「HTTP_HOST」是什麼意思? $ HTTP_HOST? – 2015-10-27 18:31:39

+0

四年前挖掘出答案的好工作! :-)我完全不記得這個問題,但是因爲我用PHP工作過很多,所以我想我的意思是'$ _SERVER ['HTTP_HOST']'PHP變量,它可能是作爲Nginx fastcgi_param發送的。我沒有這個配置文件了,但閱讀[this](http://stackoverflow.com/a/15414811/238978)所以我很確定它可能是'$ host' Nginx變量。 – 2015-10-27 19:01:21

+0

謝謝你的回答!然後,只是爲了說清楚,因爲它的答案有點令人困惑:nginx不會將'$ http_host'設置爲虛擬主機的名稱,而只是將原始HTTP頭字段「Host」複製到其中。如果這是空的,就像'$ http_host'一樣。 – 2015-10-27 19:23:06

6

抓取工具(例如谷歌),刮板或甚至完美合法的腳本與您的API接口可能會意外或無意地跳過主機頭。

我添加了這個答案,因爲這個問題出現在谷歌,當我尋找同樣的事情。