サイトを別のサーバに移行する場合(まだのんびりやってます)、テスト中にリンクが絶対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です。タイトルも変えました。