您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

golang反向代理无法访问

2024/4/10 5:06:29发布13次查看
首先,我们来看一下如何得到一个反向代理结构体
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.directorp.director = func(r *http.request) { d(r) r.host = u.host}
相关视频教程推荐:golang视频教程
以上就是golang反向代理无法访问的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product