nginxには定義した特定のcontent-typeの時にレスポンスの中の文字列を書き換えるsub_filterという機能があります。
こちらですね。Module ngx_http_sub_module
できることは文字列の書き換えで、
sub_filter 'example.com' 'www.example.com';
と定義するとレスポンスの中のexample.com
という文字列をwww.example.com
に書き換えてくれます。sub_filter_once
のon,offで繰り返し置換するかどうかの設定をすることができ、sub_filter_types
で置換の対象とするcontent-typeを複数指定できます。利用シーンとしては、特定のURLにアクセスしたときだけでリクエストの中身書き換えたいとか、アプリケーション側の変更無しでサイトドメイン等変更したい時などが考えられます。
sub_filterを使っていて少しハマった挙動としては、例えば hoge.example.com
とfuga.example.com
をwww.example.com
に書き換えたいという時は、
sub_filter `hoge.example.com` `fuga.example.com`; sub_filter `fuga.example.com` `www.example.com`;
みたいな書き方をするとhoge.example.com
がfuga.example.com
に書き換わった後に、書き換わったfuga.example.com
はwww.example.com
には書き換わらないのでちゃんと
sub_filter `hoge.example.com` `www.example.com`; sub_filter `fuga.example.com` `www.example.com`;
と丁寧に書いてあげる必要があります。またgzip圧縮指定をしているとレスポンスの中身の書き換えが正常に行われないので置換したいURLへのアクセスには proxy_set_header Accept-Encoding "";
を指定のlocationなりにつけてあげる必要があります。