我无法使用反向代理更改主机标头

2024年 2月 10日 101.6k 0

我无法使用反向代理更改主机标头

在进行网站开发或维护过程中,有时我们会遇到无法使用反向代理来更改主机标头的问题。这可能会给我们带来一些困扰和限制。在这篇文章中,php小编小新将为大家解释为什么会出现这个问题,以及如何解决这个问题。无论你是初学者还是有经验的开发者,本文都将为你提供有用的解决方案和技巧,帮助你克服这个难题,顺利完成你的网站开发工作。

问题内容

我正在为我的后端构建一个反向代理,但我不明白为什么即使我使用我在文档中看到的任何方法更改主机标头它也不会改变。
后端需要真正的主机才能提供正确的内容。

这是代码:

proxy := &httputil.ReverseProxy{
Director: func(req *http.Request) {
targetURL := url.URL{
Scheme: "http",
Host: "backend.com",
Path: req.URL.Path,
}

req.URL.Scheme = targetURL.Scheme
req.URL.Host = targetURL.Host
req.URL.Path = targetURL.Path
req.Header.Set("Host", targetURL.Host)

},
Transport: transport,
}

// Listen on a local port and serve the reverse proxy without buffer method
server := &http.Server{
Addr: "localhost:8080",
Handler: proxy,
}
fmt.Println("Listening on :8080...")
err = server.ListenAndServe()
if err != nil {
fmt.Println(err)
}

登录后复制

解决方法

如果可以使用(*proxyrequest).seturl添加在 go1.20 中,这将很简单:

proxy := &httputil.reverseproxy{
rewrite: func(pr *httputil.proxyrequest) {
targeturl := url.url{
scheme: "http",
host: "backend.com",
path: req.url.path,
}
pr.seturl(&targeturl)
},
transport: transport,
}

登录后复制

有关更多信息,请参阅此提案:net/http/httputil:用 rewrite 替换 director一个>.

如果无法升级到go1.20,这里有一个针对director的解决方法:

proxy := &httputil.ReverseProxy{
Director: func(req *http.Request) {
targetURL := url.URL{
Scheme: "http",
Host: "backend.com",
Path: req.URL.Path,
}

req.URL.Scheme = targetURL.Scheme
req.URL.Host = targetURL.Host
req.URL.Path = targetURL.Path
- req.Header.Set("Host", targetURL.Host)
+ req.Host = targetURL.Host
+ // or simply:
+ // req.Host = ""
},
Transport: transport,
}

登录后复制

请参阅 http.request.host 的文档:

对于客户端请求,主机可以选择覆盖要发送的主机标头。如果为空,request.write 方法将使用 url.host 的值。

以上就是我无法使用反向代理更改主机标头的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论