首先,我們來看看如何得到一個反向代理結構體
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,這也導致了我們的反向代理只能在本地進行代理。所以我們只要對這個函數進行修改就可以了,有兩種方式可以修改。
(推薦教學:golang教學)
修改方法:
1、我們可以將NewSingleHostReverseProxy函數拷貝出來進行修改,反正這個函數也不複雜,然後在需要用到反向代理結構體的地方用我們自訂的函數新建代理程式。
func NewProxy(target *url.URL) *httputil.ReverseProxy { targetQuery := target.RawQuery director := func(req *http.Request) { req.Host = target.Host // -- 加入这句 -- 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 { // explicitly disable User-Agent so it's not set to default value req.Header.Set("User-Agent", "") } } return &httputil.ReverseProxy{Director: director} }
然後將httputil.NewSingleHostReverseProxy(u)替換成NewProxy(u)就可以代理到其他網域了。
2、自訂Director函數。我們還是用NewSingleHostReverseProxy函數新建代理器,然後自訂一個Director函數給它。
p := httputil.NewSingleHostReverseProxy(u) d := p.Director p.Director = func(r *http.Request) { d(r) r.Host = u.Host }
相關影片教學推薦:golang影片教學
以上是golang反向代理無法訪問的詳細內容。更多資訊請關注PHP中文網其他相關文章!