nginxでHTMLを改変

nginxでリバースプロクシを実現しているアプリケーションが出力するHTMLに、aタグとか画像リンク中に絶対パスが含まれているところがあって、ちょいと困ったことになっている。
消してくれとリクエストしたんですが、ベンダさんはできないとの回答。できないのとやり方を知らないのは違うぞ。
まぁそんなことも言ってられないのでこちらでなんとかする。要するに絶対パスのところに入ってるアドレスとかプロトコルあたりを消しちゃえばいい。
Apacheならmod_sedでできるんですが、nginxだとどうするんだろと調べたところ、sub_moduleってのがあるみたいなのでこれで実現。

nginxをconfigure,makeし直す。

sub_moduleを有効にする。

$ ./configure ..(中略) --with-http_sub_module
$ make 
$ sudo make install

設定ファイル書く

こんな感じ。

location /hoge {
    proxy_set_header Accept-Encoding "";
    sub_filter 'http://hoge.example.com:8080' '' ;
    sub_filter_once off
    proxy_pass http://hoge.example.com:8080/fuga ;
}

nginxとプロクシ先との通信が圧縮されていると変換できないので、Accept-Encodingを空にする。残念ながらこのモジュールは正規表現は利用できないので、単純な文字列置き換えしかできない。今回のケースではそれでも充分役に立つのでそのまま利用する。
正規表現での置き換えが必要な場合は lua モジュールを利用するとハッピーなようですが、なかなか敷居が高い。

再起動する

ちゃんと再起動する。-s reloadだと上記モジュール有効になりません。それで1時間ほど悩んだ。