本文摘自php中文网,作者V,侵删。

首先,我们来看一下如何得到一个反向代理结构体
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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函数拷贝出来进行修改,反正这个函数也不复杂,然后在需要用到反向代理结构体的地方用我们自定义的函数新建代理器。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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 {
req.Header.Set( "User-Agent" , "" )
}
}
return &httputil.ReverseProxy{Director: director}
}
|
然后将httputil.NewSingleHostReverseProxy(u)替换成NewProxy(u)就可以代理到其他域名了。
2、自定义Director函数。我们还是用NewSingleHostReverseProxy函数新建代理器,然后自定义一个Director函数给它。
1 2 3 4 5 6 | p := httputil.NewSingleHostReverseProxy(u)
d := p.Director
p.Director = func(r *http.Request) {
d(r)
r.Host = u.Host
}
|
相关视频教程推荐:golang视频教程
以上就是golang反向代理无法访问的详细内容,更多文章请关注木庄网络博客!!
相关阅读 >>
"b = &boy{}" vs "*b = boy{}" 谁不讲武德?golang 逃逸分析入门
golang 架构设计原则 迪米特法则
手撸golang go与微服务 saga模式之6
go test
go - 常用签名算法的基准测试
golang 入门系列(五)go语言中的面向对象
【译文】go 高级并发
手撸golang 仿spring ioc/aop 之8 扫码3
前 言
go中的方法与接收器
更多相关阅读请进入《golang》频道 >>
老貘
一个与时俱进的Go编程知识库。
转载请注明出处:木庄网络博客 » golang反向代理无法访问