重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器等服務(wù)
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器等服務(wù)
HTTP協(xié)議即超文本傳輸協(xié)議,是Internet上進(jìn)行信息傳輸時(shí)使用最為廣泛的一種非常簡(jiǎn)單的通信協(xié)議。部分局域網(wǎng)對(duì)協(xié)議進(jìn)行了限制,只允許用戶通過HTTP協(xié)議訪問外部網(wǎng)站。
成都創(chuàng)新互聯(lián)公司是一家朝氣蓬勃的網(wǎng)站建設(shè)公司。公司專注于為企業(yè)提供信息化建設(shè)解決方案。從事網(wǎng)站開發(fā),網(wǎng)站制作,網(wǎng)站設(shè)計(jì),網(wǎng)站模板,微信公眾號(hào)開發(fā),軟件開發(fā),微信平臺(tái)小程序開發(fā),10余年建站對(duì)成都履帶攪拌車等多個(gè)行業(yè),擁有多年的網(wǎng)站運(yùn)維經(jīng)驗(yàn)。
HTTP功能支持“直接連接”和通過”HTTP代理“形式的連接。選擇其中的何種形式,要視用戶所在的局域網(wǎng)(或其它上網(wǎng)環(huán)境)的具體情況。
以QQ為例:簡(jiǎn)單地說,如果用戶所在局域網(wǎng)并未設(shè)置任何代理服務(wù)器,則選擇“直接連接”就可以實(shí)現(xiàn)QQ連通;而如果用戶所在局域網(wǎng)設(shè)置了代理服務(wù)器,則必須選擇“通過HTTP代理”,并填寫所在局域網(wǎng)的代理服務(wù)器地址、端口等詳細(xì)資料,方有可能實(shí)現(xiàn)QQ連通。
注意:2012年HTTP功能已支持包括MS Proxy Server等大部分代理服務(wù)軟件,但可能存在對(duì)少數(shù)代理服務(wù)軟件尚不支持的現(xiàn)象。
因局域網(wǎng)配置環(huán)境較為復(fù)雜,大家可以先通過“測(cè)試”功能,測(cè)定是否可通過HTTP功能實(shí)現(xiàn)QQ連通。
golang net/http標(biāo)準(zhǔn)庫的client是可以配置各種代理的,http/https/sock5等,不過fasthttp僅支持配置sock5代理,通過定義fasthttp dialfunc實(shí)現(xiàn):
項(xiàng)目中碰到的問題是,ops只提供了用squid搭建的http代理,所以是想重新定義一個(gè)http代理的dialfunc,找了fasthttp github倉庫的issue,作者提供了一個(gè)dialFunc
經(jīng)測(cè)試,訪問https的站點(diǎn)是OK的,訪問http的站點(diǎn)不行,代理連接不上。先說一下http/https代理的區(qū)別,再說原因。
使用代理訪問https網(wǎng)站時(shí),會(huì)先發(fā)CONNECT請(qǐng)求,讓代理與目標(biāo)站點(diǎn)建立一個(gè)http tunnel,之后在這個(gè)tunnel基礎(chǔ)上進(jìn)行傳輸,對(duì)應(yīng)到上面的dialFunc過程就是:
可以看到http站點(diǎn)是不需要發(fā)CONNECT請(qǐng)求的,而是直接將目標(biāo)站點(diǎn)的url作為path 填寫在http請(qǐng)求頭中。
為何上面的dialfunc訪問http站點(diǎn)不行呢,查了squid代理的文檔,發(fā)現(xiàn)squid默認(rèn)會(huì)禁止非https站點(diǎn)通過CONNECT方法建立通道,自己搭了個(gè)squid代理去掉配置項(xiàng),發(fā)現(xiàn)上面的dialfunc是可以訪問http、https站點(diǎn)的,就是說http,https都先建立通過,再請(qǐng)求。
看了fasthttp的源碼,沒辦法在請(qǐng)求前修改request header中的path為目標(biāo)站點(diǎn)url,所以如果需要通過fasthttp使用http代理,那么可以使用上面的dialfunc,同時(shí)代理需要允許非443端口的站點(diǎn)可以建立通道。如果做不到這一點(diǎn),那么還是建議使用標(biāo)準(zhǔn)庫net/http的client,會(huì)更方便一點(diǎn)。
首先解釋一下反向代理,所謂的反向代理就是代理服務(wù)器,充當(dāng)Web服務(wù)器網(wǎng)關(guān)的代理服務(wù)器。當(dāng)請(qǐng)求發(fā)送到使用反向代理的Web服務(wù)器時(shí),他們將先轉(zhuǎn)到反向代理,由該代理將確定是將其路由到制定的Web服務(wù)器。
這個(gè)程序是將 本地的8086 端口作為代理服務(wù)器,代理上篇 golang HTTP實(shí)例 里面的8090端口
核心只有一個(gè)函數(shù) httputil.NewSingleHostReverseProxy
兩個(gè)服務(wù)同時(shí)運(yùn)行
效果如下:
代理服務(wù)器訪問 8086端口時(shí)候
訪問原始的端口8090時(shí)候