ホームページ  >  記事  >  バックエンド開発  >  golangリバースプロキシにアクセスできません

golangリバースプロキシにアクセスできません

王林
王林オリジナル
2020-03-12 11:26:092808ブラウズ

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 は、クロージャをディレクターとして使用して、新しい ReverseProxy 構造を作成し、ディレクターこれはデフォルトで実装されるプロキシ関数です。この関数ではリクエストURLのプロトコル、ホスト、パスを書き換えます。ただし、req.Host は書き換えられないため、リバース プロキシはローカルでのみプロキシできることになります。したがって、この関数を変更するだけで済みます。変更するには 2 つの方法があります。

(推奨チュートリアル: 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. ディレクター機能をカスタマイズします。新しいプロキシを作成するために引き続き NewSingleHostReverseProxy 関数を使用し、それに対して Director 関数をカスタマイズします。

p := httputil.NewSingleHostReverseProxy(u)
d := p.Director
p.Director = func(r *http.Request) {
	d(r)
	r.Host = u.Host
}

おすすめの関連ビデオ チュートリアル: golang ビデオ チュートリアル

以上がgolangリバースプロキシにアクセスできませんの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。