温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

golang反向代理无法访问的解决方案

发布时间:2020-04-08 15:07:28 来源:亿速云 阅读:250 作者:小新 栏目:编程语言

这篇文章主要为大家详细介绍了golang反向代理无法访问的解决方案,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

golang反向代理无法访问的解决方案

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

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,这也就导致了我们的反向代理只能在本地进行代理。所以我们只要对这个函数进行修改就可以了,有两种方式可以修改。

修改方法:

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反向代理无法访问的解决方案就分享到这里了,当然并不止以上和大家分析的办法,不过小编可以保证其准确性是绝对没问题的。希望以上内容可以对大家有一定的参考价值,可以学以致用。如果喜欢本篇文章,不妨把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI