maco's life

最近は技術以外のことを主に記載しています。

Nginxのngx_http_sub_module#sub_filterの挙動

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.comfuga.example.comwww.example.comに書き換えたいという時は、

sub_filter `hoge.example.com` `fuga.example.com`;
sub_filter `fuga.example.com` `www.example.com`;

みたいな書き方をするとhoge.example.comfuga.example.comに書き換わった後に、書き換わったfuga.example.comwww.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なりにつけてあげる必要があります。