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一下。