指定された Go コードでは、リクエストを www.google.com にリダイレクトするようにリバース プロキシが設定されています。リバース プロキシが正しく機能している間、プロキシされたリクエストの応答本文にどのようにアクセスできるのかという疑問が生じます。
これに対する解決策は、ReverseProxy タイプを提供する httputil パッケージにあります。パッケージの最新バージョンでは、ReverseProxy はバックエンドからの応答のカスタマイズと検査を可能にするオプションの ModifyResponse 関数を提供します。
具体的には、この関数を実装することで、開発者は渡す前に *http.Response を変更できます。それをクライアントに。 ModifyResponse の潜在的な使用例の 1 つは、応答本文の読み取りと操作です。
これを示すために、次の変更されたコードを考えてみましょう。
package main import ( "bytes" "fmt" "io/ioutil" "net/http" "net/http/httputil" "net/url" ) func main() { target := &url.URL{Scheme: "http", Host: "www.google.com"} proxy := httputil.NewSingleHostReverseProxy(target) proxy.ModifyResponse = func(resp *http.Response) (err error) { b, err := ioutil.ReadAll(resp.Body) // Read the HTML response body if err != nil { return err } resp.Body.Close() // The body is closed by the ReadAll function, but it's good practice to close it again b = bytes.Replace(b, []byte("server"), []byte("schmerver"), -1) // Modify the HTML response by replacing "server" with "schmerver" newBody := ioutil.NopCloser(bytes.NewReader(b)) resp.Body = newBody resp.ContentLength = int64(len(b)) resp.Header.Set("Content-Length", strconv.Itoa(len(b))) fmt.Println(resp) // Print the modified response for debugging purposes return nil } http.Handle("/google", proxy) http.ListenAndServe(":8099", nil) }
このコードでは、ModifyResponse 関数は読み取りを行うように定義されています。 HTML 応答本文を変更し、特定の文字列を置き換えて、変更した本文を応答本文として設定します。 「/google」 URL パスを処理することにより、www.google.com へのリクエストがプロキシされ、変更された応答がクライアントに返されます。
以上がGo でリバース プロキシの応答本文を検査および変更するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。