先重温一下什么叫反向代理,正向代理 。
鹅厂二面 , nginx回忆录
所谓正向,反向代理取决于代理的是出站请求 , 还是入站请求 。
正向代理: 代理的出站请求 , 客户端能感知到代理程序,架构上距离客户端更近 。反向代理: 代理的是入站请求,客户端认为代理程序就是服务器,客户端感知不到代理逻辑,架构上距离服务端更近 。
文章插图
前几天利用golang实现了反向代理程序,引出了Host请求头在反代中的关键作用 。
文章插图
对于proxy.com的请求,都被透明无感代理到A.com
package mainimport ( "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 = targetreq.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 mainimport ( "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.Hostreq.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) }}
其中要注意的就是,正向代理式要规避死循环代理 。使用该服务作为代理程序,将可以出站访问任何地址 。
使用时,针对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:8080www.baidu.com
文章插图
GO快闪#本文总结了go语言正反向代理的姿势 。
【Go语言正/反向代理的姿势】
推荐阅读
- 上古卷轴5如何快速结婚(上古卷轴5正常娶妻排行)
- 真正“搞”懂HTTP协议03之时间穿梭
- 奥比岛暗夜袭击回答结论正确答案详解
- 支付宝蚂蚁庄园今天正确答案8.20
- 怎么下载ps电脑永久免费版(一个正版的ps要多少钱)
- 2022支付宝蚂蚁庄园今天正确答案8.22
- 琉璃神社分享好音乐传播正能量 网页-怎么打不开了
- 奥比岛:梦想国度真正被频繁投诉的是哪支施工队答案是什么
- UML建模语言、设计原则、设计模式
- 38 全球名校AI课程库| 马萨诸塞大学 · 自然语言处理进阶课程『Advanced Natural Language Processing』