我无法使用反向代理更改主机标头
短信预约 -IT技能 免费直播动态提醒
在进行网站开发或维护过程中,有时我们会遇到无法使用反向代理来更改主机标头的问题。这可能会给我们带来一些困扰和限制。在这篇文章中,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,
}
对于客户端请求,主机可以选择覆盖要发送的主机标头。如果为空,request.write 方法将使用 url.host 的值。
以上就是我无法使用反向代理更改主机标头的详细内容,更多请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341