http頭中Host字段的作用

http報文頭部包含了請求方法,請求的資源等信息,但是對于Host字段一直覺得可有可無,因為我所認為的Host的字段的作用在于指明http報文的方向,訪問的地點,但是實際報文轉發都是由底層目的端口IP決定了,所以覺得Host字段沒有用。

問題

問題在于當我寫的一個socket代理上,我的目的是把所有請求的報文全部重定向到一個固定的IP和端口上,想法很簡單,接收請求,新建socket,連接到固定IP和端口,轉發請求。結果報錯:

socket.error: [Errno 104] Connection reset by peer

這個錯誤一般出在C/S模式中一方數據還在等待,一方卻關閉了連接。我把重定向取消,即連接到原先請求想要請求的網址,程序正常運行。那么問題出在哪?

原因

前面講了,就是http請求頭的問題,http請求頭第一行指明請求資源,若是沒有該資源,會返回一個錯誤頁面,但是起碼是有返回信息的。但是如果Host這個字段錯誤,服務端就會丟棄這個連接,而客戶端還在等待接收,這樣就會報錯。那么Host字段的作用是什么。

Host字段

我們知道,不同的域名通過A記錄或者CNAME方式可以連接都同一個IP下,同一個IP也可以設置多個不同站點,那我訪問不同的域名都轉發到同一IP,怎么區分這些不同的站點呢,就是用的Host字段,如果服務器后臺解析出Host但是服務器上找不到相應的站點,那么這個連接很可能會被丟棄,從而報錯。
我在程序當中將Host修改成

Host: www.baidu.com

再將請求的資源路徑修改成“/”,socket定向到百度的IP,訪問成功百度首頁,且不會報錯。

總結

小錯誤,卻花了點時間解決,mark一下。

參考

網絡---一篇文章詳解請求頭Host的概念

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容