golang反向代理无法访问

互联网 20-3-12

首先,我们来看一下如何得到一个反向代理结构体

func NewSingleHostReverseProxy(target *url.URL) *ReverseProxy { 	targetQuery := target.RawQuery 	director := func(req *http.Request) { 		req.URL.Scheme = target.Scheme 		req.URL.Host = target.Host 		req.URL.Path = singleJoiningSlash(target.Path, req.URL.Path) 		if targetQuery == "" || req.URL.RawQuery == "" { 			req.URL.RawQuery = targetQuery + req.URL.RawQuery 		} else { 			req.URL.RawQuery = targetQuery + "&" + req.URL.RawQuery 		} 		if _, ok := req.Header["User-Agent"]; !ok { 			req.Header.Set("User-Agent", "") 		} 	} 	return &ReverseProxy{Director: director} }

NewSingleHostReverseProxy用了一个闭包作为Director新建了一个ReverseProxy结构体,director就是它为我们默认实现的代理函数。在这个函数中重写了请求URL的协议、Host和Path等。但是它没有重写req.Host,这也就导致了我们的反向代理只能在本地进行代理。所以我们只要对这个函数进行修改就可以了,有两种方式可以修改。

(推荐教程:golang教程)

修改方法:

1、我们可以将NewSingleHostReverseProxy函数拷贝出来进行修改,反正这个函数也不复杂,然后在需要用到反向代理结构体的地方用我们自定义的函数新建代理器。

func NewProxy(target *url.URL) *httputil.ReverseProxy { 	targetQuery := target.RawQuery 	director := func(req *http.Request) { 		req.Host = target.Host // -- 加入这句 -- 		req.URL.Scheme = target.Scheme 		req.URL.Host = target.Host 		req.URL.Path = singleJoiningSlash(target.Path, req.URL.Path) 		if targetQuery == "" || req.URL.RawQuery == "" { 			req.URL.RawQuery = targetQuery + req.URL.RawQuery 		} else { 			req.URL.RawQuery = targetQuery + "&" + req.URL.RawQuery 		} 		if _, ok := req.Header["User-Agent"]; !ok { 			// explicitly disable User-Agent so it's not set to default value 			req.Header.Set("User-Agent", "") 		} 	} 	return &httputil.ReverseProxy{Director: director} }

然后将httputil.NewSingleHostReverseProxy(u)替换成NewProxy(u)就可以代理到其他域名了。

2、自定义Director函数。我们还是用NewSingleHostReverseProxy函数新建代理器,然后自定义一个Director函数给它。

p := httputil.NewSingleHostReverseProxy(u) d := p.Director p.Director = func(r *http.Request) { 	d(r) 	r.Host = u.Host }

相关视频教程推荐:golang视频教程

以上就是golang反向代理无法访问的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: 反向代理
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:golang读写文件的几种方法

相关资讯