1 回答

TA贡献1811条经验 获得超6个赞
我相信你有两个选择。
1.实施http.RoundTripper
您实现自己的RoundTripper并在那里重新设置X-Forwarded-For。(示范)
type MyRoundTripper struct{}
func (t *MyRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
req.Header["X-Forwarded-For"] = []string{"1.2.3.4"}
return http.DefaultTransport.RoundTrip(req)
}
func main() {
http.ListenAndServe(":80", &httputil.ReverseProxy{
Director: director,
Transport: &MyRoundTripper{},
})
}
当Transport未设置该字段时,httputil.ReverseProxy它会回退到http.DefaultTransport,因此您也可以在自定义代码后回退到它。
2.取消设置req.RemoteAddr
RemoteAddr在调用反向代理之前重置原始请求的字段。该字段由 HTTP 服务器设置,如果存在,将触发X-Forwarded-For反向代理实现中的替换。(示范)
func main() {
http.ListenAndServe(":80", func(w http.ResponseWriter, r *http.Request) {
r.RemoteAddr = ""
proxy := &httputil.ReverseProxy{ Director: director }
proxy.ServeHTTP(w, r)
})
}
但是,此行为依赖于实现细节,将来可能会或可能不会更改。我建议改用选项 1。
- 1 回答
- 0 关注
- 184 浏览
添加回答
举报