golang反向代理无法访问


本文摘自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 {

            // 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函数给它。

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反向代理无法访问的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

golang+libreffice6.2实现word,excel,pptx转pdf,html

golang fyne 使用中文并打包进二进制文件

以下两个函数执行结果一样嘛? 为什么

golang的多态

go并发处理

[go] go语言实战-为博客园增加gofly在线客服功能

golang程序设计——函数

go-gin源码(一)

手把手教你实现golang跨平台编译

go语言学习(四):数组和切片

更多相关阅读请进入《golang》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...