gpt4 book ai didi

networking - Golang反向代理到nginx背后的app

转载 作者:IT王子 更新时间:2023-10-29 02:03:30 28 4
gpt4 key购买 nike

我正在使用 Golang 编写一个简单的反向代理。代码如下:

func NewMultiHostProxy(target_urls []string) gin.HandlerFunc {
var urls []*url.URL
for i := 0; i < len(target_urls); i++ {
target, err := url.Parse(target_urls[i])
if err != nil {
fmt.Errorf("Error parsing url")
return nil
}
urls = append(urls, target)
}
return func(c *gin.Context) {
director := func(req *http.Request) {
target := urls[rand.Int()%len(urls)]
r := c.Request
req = r
req.URL.Scheme = target.Scheme
req.URL.Host = target.Host
req.URL.Path = target.Path
req.Header.Set("X-GoProxy", "GoProxy")
if target.RawQuery == "" || req.URL.RawQuery == "" {
req.URL.RawQuery = target.RawQuery + req.URL.RawQuery
} else {
req.URL.RawQuery = target.RawQuery + "&" + req.URL.RawQuery
}
log.Print(req.URL)
}
proxy := &httputil.ReverseProxy{Director: director}
proxy.ServeHTTP(c.Writer, c.Request)
}
}

当我尝试将一个请求代理到 Nginx 后面的 REST api 时,Nginx 总是返回 404。但是,如果我直接访问 REST api,它会正确返回结果。这是我的 Nginx 配置:

server {
listen 80;
server_name myservername;

location /api {
proxy_pass http://127.0.0.1:5000;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

我可以知道如何调试这个问题吗?是Nginx配置引起的吗?

最佳答案

来自 https://golang.org/pkg/net/http/httputil/#ReverseProxy :

    // Director must be a function which modifies
// the request into a new request to be sent
// using Transport. Its response is then copied
// back to the original client unmodified.
// Director must not access the provided Request
// after returning.
Director func(*http.Request)

也就是&httputil.ReverseProxy{Director: director}中用来构造ReverseProxy的函数

但是您的主管从不修改原始req 指向的http.Request。它用 req = r 重新分配指针。改为修改不相关的 http.Request

关于networking - Golang反向代理到nginx背后的app,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42466491/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com