一個可能的解釋是,您設計了一個HTTP/1.0代理,而共享託管網站上的任何網站最近都只能使用HTTP/1.1(嗯,不太好,但我會去的那在一秒鐘)。
這不是只有長期以來可能存在的問題,但你必須舉一個例子,說明一個網站失敗了,以獲得更多的想法。
您似乎瞭解HTTP的基本知識,即客戶端與服務器建立TCP連接並通過它發送HTTP請求,該請求由請求行(例如GET /path/name/item.html HTTP/1.0
)和一組可選標題行組成,全部由CRLF分隔(即\r\n
)。整個批次以兩個連續的CRLF序列結束,此時另一端的服務器將請求與資源進行匹配併發送適當的響應。資源全部由路徑標識(例如/path/name/item.html
),這可能是一個真實的文件,或者它可能是一個動態頁面。
自從第一次發明以來,HTTP的大部分內容幾乎沒有變化。但是,請考慮客戶端如何找到要連接的服務器。什麼你給它一個URL,就像這樣:
http://www.example.com/path/name/item.html
從這一點着眼於方案這是http
,所以它知道它使一個HTTP連接。接下來的部分是主機名。在原始的HTTP下,假設每個主機名解析爲它自己的IP地址,然後客戶端連接到該IP地址併發出請求。由於每個服務器在當時只有一個網站,所以這個效果很好。
隨着網站數量增加,但是,它變得很難給每個網站不同的IP地址,尤其是很多網站都如此簡單,他們可以很容易地在同一臺物理機器上共享。這是很容易在同一個IP地址指向多個域(DNS系統使這很簡單),但是當服務器收到的TCP請求,它只是知道它有它的IP地址的請求 - 它不知道哪個網站發回。因此,添加了一個新Host
頭,以便客戶端可以在主機有人請求請求本身表示。這意味着一臺服務器可能擁有大量的網站和網絡服務器可以使用Host
頭來告訴在響應服務於哪一個。
這幾天這是非常普遍的 - 如果你不使用Host
標題比多個網站不知道你要問的是哪個服務器。通常會發生的事情是,他們會從他們已經擁有的列表中假設一些默認網站,而且有可能這些網站沒有您要求的文件。即使你要求/
,如果你沒有提供Host
標題,那麼網絡服務器可能會給你一個404,如果它是這樣配置的話 - 如果沒有合理的默認網站給出,這也不是不合理的您。
如果您需要更多技術細節,您可以在the HTTP RFC中找到對Host
標題的描述。
此外,有可能網站只是簡單地拒絕HTTP/1.0 - 我會略微如果發生在如此多的網站上,但你永遠不知道。不過,請先嚐試Host
標題。
與某些人認爲沒有什麼可以阻止您使用HTTP/1.0的Host
標頭相反,儘管您可能仍會發現一些不喜歡的服務器。這比支持完整的HTTP/1.1要容易一些,它要求你理解分塊編碼和其他複雜性,儘管對於簡單的示例代碼,只需添加Host
標題並將其稱爲HTTP/1.1(我不會建議然而,這對生產代碼是足夠的)。
無論如何,你可以嘗試添加Host
頭,使您的要求是這樣的:
GET /path/name/item.html HTTP/1.0\r\n
Host: www.example.com\r\n
\r\n
我經歷了只是爲了方便閱讀的行拆分它 - 你可以看到仍然有空白行末。
即使這不會導致你看到的問題,現在Host
頭是一個非常好的主意,因爲肯定有沒有它的網站是不行的。如果你仍然有問題,他們給我一個不適合你的網站的例子,我們可以嘗試並找出原因。
如果有什麼我說的不清楚或需要更多的細節,只是問。
非常感謝您的詳細回覆。我不知道我需要包含主機頭。我將它添加到了我的HTTP請求中,一切都開始正常工作了! 我感謝您的幫助! – StayPuff
你很受歡迎。嚴格地說,你不需要*'主機'頭部 - 但正如你發現的,很多網站沒有它將無法工作! (^_^) – Cartroo
優秀的解釋! – LazerSharks