溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

golang反向代理無法訪問的解決方案

發(fā)布時間:2020-04-08 15:07:28 來源:億速云 閱讀:258 作者:小新 欄目:編程語言

這篇文章主要為大家詳細介紹了golang反向代理無法訪問的解決方案,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下。

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,這也就導致了我們的反向代理只能在本地進行代理。所以我們只要對這個函數進行修改就可以了,有兩種方式可以修改。

修改方法:

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反向代理無法訪問的解決方案就分享到這里了,當然并不止以上和大家分析的辦法,不過小編可以保證其準確性是絕對沒問題的。希望以上內容可以對大家有一定的參考價值,可以學以致用。如果喜歡本篇文章,不妨把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI