最关键的部分在这段代码,我们在创建一个反向代理的时候,重定向闭包函数 Director 没有重置请求的 host,导致没法重定向到 localhost 以外的地址
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}}
最后解决代码如下:
package main
import ( "fmt" "net/http" "net/http/httputil" "net/url")
func main() { target, err := url.Parse("http://example.com") if err != nil { fmt.Println("Error parsing target URL:", err) return }
proxy := httputil.NewSingleHostReverseProxy(target) d := proxy.Director proxy.Director = func(r *http.Request) { d(r) r.Host = target.Host }
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Println("Proxying request to:", r.URL) proxy.ServeHTTP(w, r) })
if err := http.ListenAndServe(":8080", nil); err != nil { fmt.Println("Error starting server:", err) }}