快速掌握Go語言正/反向代理
先重溫一下什么叫反向代理,正向代理。
所謂正向,反向代理取決于代理的是出站請求,還是入站請求。
正向代理: 代理的出站請求, 客戶端能感知到代理程序,架構上距離客戶端更近。
反向代理: 代理的是入站請求,客戶端認為代理程序就是服務器,客戶端感知不到代理邏輯,架構上距離服務端更近。
前幾天利用golang實現(xiàn)了反向代理程序,引出了Host請求頭在反代中的關鍵作用。
對于proxy.com的請求,都被透明無感代理到A.com
package main import ( "fmt" "log" "net/http" "net/http/httputil" ) func ReverseProxyHandler(w http.ResponseWriter, r *http.Request) { fmt.Println("receive a request from:", r.RemoteAddr, r.Header) target := "www.baidu.com" director := func(req *http.Request) { req.URL.Scheme = "https" req.URL.Host = target req.Host = target } proxy := &httputil.ReverseProxy{Director: director} proxy.ServeHTTP(w, r) } func main() { fmt.Printf("Starting server at port 8080\n") if err := http.ListenAndServe(":8080", http.HandlerFunc(ReverseProxyHandler)); err != nil { log.Fatal(err) } }
這幾天剛好遇到了一個正常代理的case, 簡單記錄一下。
package main import ( "fmt" "log" "net/http" "net/http/httputil" ) func ProxyHandler(w http.ResponseWriter, r *http.Request) { fmt.Printf("receive a request from {0} {1}: \n", r.RemoteAddr, r.Header) if r.Host != "localhost:8080" { director := func(req *http.Request) { req.URL.Scheme = "http" req.URL.Host = r.Host req.Host = r.Host } proxy := &httputil.ReverseProxy{Director: director} proxy.ServeHTTP(w, r) } else { http.NotFound(w, r) } } func main() { if err := http.ListenAndServe(":8080", http.HandlerFunc(ProxyHandler)); err != nil { log.Fatal(err) } }
其中要注意的就是,正向代理式要規(guī)避死循環(huán)代理。
使用該服務作為代理程序,將可以出站訪問任何地址。
使用時,針對httpclient設置proxy
//adding the proxy settings to the Transport object transport := &http.Transport{ Proxy: http.ProxyURL(proxyURL), } //adding the Transport object to the http Client client := &http.Client{ Transport: transport, }
下面使用curl指令演示(-x 后接代理地址)
curl -x 127.0.0.1:8080 www.baidu.com
GO快閃#
本文總結了go語言正反向代理的姿勢。
到此這篇關于快速掌握Go語言正/反向代理的文章就介紹到這了,更多相關Go語言正/反向代理內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
淺析go中Ticker,Timer和Tick的用法與區(qū)別
在go面試的時候,面試官經常會問time包的Ticker,Timer以及Tick的區(qū)別,一般在超時控制的時候用的比較多,今天就跟隨小編一起來詳細學一下這幾個的區(qū)別吧2023-10-10用gin開發(fā)的golang項目三種開發(fā)模式方式
這篇文章主要介紹了用gin開發(fā)的golang項目三種開發(fā)模式方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01詳解Go如何基于現(xiàn)有的context創(chuàng)建新的context
在?Golang?中,context?包提供了創(chuàng)建和管理上下文的功能,那么在GO語言中如何基于現(xiàn)有的context創(chuàng)建新的context,下面小編就來和大家詳細聊聊2024-01-01golang實現(xiàn)頁面靜態(tài)化操作的示例代碼
這篇文章主要介紹了golang實現(xiàn)頁面靜態(tài)化操作的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-02-02