提供された Go コードでは、リクエストを Google にリダイレクトするためにリバース プロキシが設定されています。ただし、より深い洞察を得る、または応答をカスタマイズするには、応答本文にアクセスすることが不可欠です。
解決策は、ReverseProxy 構造体内の ModifyResponse フィールドを利用することにあります。このフィールドを使用すると、HTTP 応答がクライアントに到達する前に変更する関数を指定できます。
次の変更されたコードは、応答本文の読み取りと変更方法を示しています。
package main import ( "bytes" "fmt" "io" "io/ioutil" "net/http" "net/http/httputil" "net/url" "strconv" ) func main() { target := &url.URL{Scheme: "http", Host: "www.google.com"} proxy := httputil.NewSingleHostReverseProxy(target) // Modify the response body before sending it to the client proxy.ModifyResponse = func(resp *http.Response) (err error) { b, err := ioutil.ReadAll(resp.Body) // Read the response body if err != nil { return err } err = resp.Body.Close() // Close the `Body` and `resp` if err != nil { return err } // Modify the response body b = bytes.Replace(b, []byte("server"), []byte("schmerver"), -1) // Create a new `body` to keep the `Content-Length` and `Body` up-to-date body := ioutil.NopCloser(bytes.NewReader(b)) resp.Body = body resp.ContentLength = int64(len(b)) resp.Header.Set("Content-Length", strconv.Itoa(len(b))) fmt.Println("Modified response: ", string(b)) // See the modified response return nil } http.Handle("/google", proxy) http.ListenAndServe(":8099", nil) }
ModifyResponse 関数は、ioutil.ReadAll を使用して元の応答本文をバッファーに読み取ります。次に、元の resp.Body を閉じ、本文の内容を変更します。
応答が有効であることを確認するために、新しい本文が作成され、resp.Body に割り当てられます。 Content-Length ヘッダーも、新しい本文の長さを反映するように更新されます。
最後に、変更された応答本文が簡単に検査できるようにコンソールに出力され、変更された応答がクライアントに送信されます。
以上がGo リバース プロキシで応答本文を検査および変更するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。