首页后端开发其他后端知识Golang反向代理怎么实现,不能访问的情况怎么办

Golang反向代理怎么实现,不能访问的情况怎么办

时间2024-03-26 21:18:03发布访客分类其他后端知识浏览1026
导读:今天就跟大家聊聊有关“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反向代理怎么实现,不能访问的情况怎么办的内容应该都清楚了吧,希望大家阅读完这篇文章能有所收获。最后,想要了解更多Golang反向代理怎么实现,不能访问的情况怎么办的知识,欢迎关注网络,网络将为大家推送更多相关知识点的文章。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: Golang反向代理怎么实现,不能访问的情况怎么办
本文地址: https://pptw.com/jishu/653764.html
Go中的interface概念怎么理解,使用是怎样子的 如何用JS写个简单登录注册页面,代码是什么

游客 回复需填写必要信息