首頁  >  文章  >  後端開發  >  golang反向代理無法訪問

golang反向代理無法訪問

王林
王林原創
2020-03-12 11:26:092798瀏覽

golang反向代理無法訪問

首先,我們來看看如何得到一個反向代理結構體

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn