まず、リバース プロキシ構造を取得する方法を見てみましょう
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 サイトの他の関連記事を参照してください。