mod_ext_filterでroot relative link化

サイトを別のサーバに移行する場合(まだのんびりやってます)、テスト中にリンクが絶対URLだと元のサイトに飛んでいってしまってテストがしづらい。ローカルのhostsファイルをいじるのはなんかカッコ悪いので避けたい。

そこで、mod_ext_filterでサイトのHTMLの要素を相対参照root relative linkにする。

mod_ext_filterは最近のApacheにはデフォルトで入っていることと思う。

例えば、このサイトのように/wordpress以下に対象のHTMLがある場合。

  • cat /etc/httpd/conf.d/relative.conf
    ExtFilterDefine relative mode=output intype=text/html outtype=text/html cmd="/bin/sed -f /etc/httpd/conf.d/relative.sed"
    <Location /wordpress>
      SetOutputFilter relative
    </Location>
  • cat /etc/httpd/conf.d/relative.sed
    s,"https://wtnb.mydns.jp,",g;
    s,’https://wtnb.mydns.jp,’,g;

このサイトで言うと、postratingsのプラグインはJavaScript部分に絶対URLが書いてあるので、上記のフィルタだけでは絶対リンクを根絶できない。あとヘッダに書かれるURL(X-Pingback:)は対象にならない。

また、mod_ext_filterはmod_deflateとあまり仲がよろしくないようだ。両方有効だと化ける。wgetやcurlで取ってくるHTMLファイルは壊れていないのに、ブラウザで見ると盛大に化けて悩んでしまった。まあ移行中のことと割り切ってmod_deflateを諦めた。例えば、

  • vi /etc/httpd/conf/httpd.conf
    • LoadModule deflate_module modules/mod_deflate.so をコメントアウト

SetOutputFilterではなくmod_filterでFilterChainを作っていけば両方活かすこともできると思う。

しかし今回の場合は適当にいじりつつしばらく様子を見ながら、時折DocumentRoot以下をrsyncで取ってきてMySQLのDBを持ってきて同期させる、ということをやる。このとき手元の環境の場合は.htaccessでmod_deflate関連の設定をAddOutputFilterByTypeでやっているから、上書きされてしまうのですね。ここをmod_filterを使うようにして云々…とやるとまた面倒なことになる。

(追記)

これで「相対参照」というのは言いすぎですね。いわゆるrelative linkではなく、root relative linkです。タイトルも変えました。