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

func NewSingleHostReverseProxy(target *url.URL) *ReverseProxy {targetQuery := target.RawQuerydirector := func(req *http.Request) {req.URL.Scheme = target.Schemereq.URL.Host = target.Hostreq.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.RawQuerydirector := func(req *http.Request) {req.Host = target.Host // -- 加入这句 --req.URL.Scheme = target.Schemereq.URL.Host = target.Hostreq.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 valuereq.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视频教程

更多相关文章

  1. golang结构体怎么判断是否为空
  2. go语言中的结构体与方法详解
  3. golang如何调用函数?
  4. 了解Go 扁平化项目结构
  5. 详解Golang中函数作为值与类型
  6. go语言中普通函数与方法的区别是什么?
  7. 详解Go 中方法与函数的区别
  8. 关于golang封装一个bash函数,用于执行bash命令
  9. 总结Golang实现PHP常用函数

随机推荐

  1. ok6410 android driver(11)
  2. Android API中文文档GridView
  3. NestedScrollingParent, NestedScrolling
  4. 〖Android〗存在多个Android设备时,使用Sh
  5. Android Selector和Shape
  6. 关于android SDK安装Failed to fetch URL
  7. 【Android】如何调节屏幕亮度,关闭屏幕
  8. 如何申请Android Map API Key
  9. Androkd开发坏境配置以及常用插件
  10. ListView高级用法