http頭中Host字段的作用

http報文頭部包含了請求方法,請求的資源等信息,但是對于Host字段一直覺得可有可無,因?yàn)槲宜J(rèn)為的Host的字段的作用在于指明http報文的方向,訪問的地點(diǎn),但是實(shí)際報文轉(zhuǎn)發(fā)都是由底層目的端口IP決定了,所以覺得Host字段沒有用。

問題

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

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

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

原因

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

Host字段

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

Host: www.baidu.com

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

總結(jié)

小錯誤,卻花了點(diǎn)時間解決,mark一下。

參考

網(wǎng)絡(luò)---一篇文章詳解請求頭Host的概念

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容