首先,我们来看一下如何得到一个反向代理结构体
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}
}
NewSingleHostReverseProxy用了一个闭包作为Director新建了一个ReverseProxy结构体,director就是它为我们默认实现的代理函数。在这个函数中重写了请求URL的协议、Host和Path等。但是它没有重写req.Host,这也就导致了我们的反向代理只能在本地进行代理。所以我们只要对这个函数进行修改就可以了,有两种方式可以修改。
(