快速掌握Go語(yǔ)言正/反向代理
先重溫一下什么叫反向代理,正向代理。
所謂正向,反向代理取決于代理的是出站請(qǐng)求,還是入站請(qǐng)求。
正向代理: 代理的出站請(qǐng)求, 客戶(hù)端能感知到代理程序,架構(gòu)上距離客戶(hù)端更近。
反向代理: 代理的是入站請(qǐng)求,客戶(hù)端認(rèn)為代理程序就是服務(wù)器,客戶(hù)端感知不到代理邏輯,架構(gòu)上距離服務(wù)端更近。

前幾天利用golang實(shí)現(xiàn)了反向代理程序,引出了Host請(qǐng)求頭在反代中的關(guān)鍵作用。

對(duì)于proxy.com的請(qǐng)求,都被透明無(wú)感代理到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)
}
}
這幾天剛好遇到了一個(gè)正常代理的case, 簡(jiǎn)單記錄一下。

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)代理。
使用該服務(wù)作為代理程序,將可以出站訪問(wèn)任何地址。
使用時(shí),針對(duì)httpclient設(shè)置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快閃#
本文總結(jié)了go語(yǔ)言正反向代理的姿勢(shì)。
到此這篇關(guān)于快速掌握Go語(yǔ)言正/反向代理的文章就介紹到這了,更多相關(guān)Go語(yǔ)言正/反向代理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang實(shí)現(xiàn)DFA算法對(duì)敏感詞過(guò)濾功能
DFA算法是確定性有限自動(dòng)機(jī),其特征是,有一個(gè)有限狀態(tài)集合和一些從一個(gè)狀態(tài)通向另一個(gè)狀態(tài)的邊,每條邊上標(biāo)記有一個(gè)符號(hào),通俗的講DFA算法就是把你要匹配的做成一顆字典樹(shù),然后對(duì)你輸入的內(nèi)容進(jìn)行匹配的過(guò)程,本文將利用DFA算法實(shí)現(xiàn)敏感詞過(guò)濾,需要的可以參考一下2023-10-10
golang jwt鑒權(quán)的實(shí)現(xiàn)流程
本文主要介紹了golang jwt鑒權(quán)的實(shí)現(xiàn)流程,包含生成JWT令牌、客戶(hù)端存儲(chǔ)和發(fā)送JWT令牌、服務(wù)端驗(yàn)證JWT令牌等,具有一定的參考價(jià)值,感興趣的可以了解一下2025-02-02

