mod_layoutの代替を探してmod_ext_filterで躓く

その昔、modlayoutなんて便利そうでやっかいなモジュールがあったなー、ちょっと使ってみるかなと思って探してみたら、開発が2008年でストップしてるわ、公式がなくなっているわ、どこにも落ちてないわでどうするかなーっと思って、やりたいことはmodlayoutっぽくHTMLに適当に挿入したいだけなんだけどなと思っていたら、modextfilterがあるって聞こえた気がしたので使ってみた。

そして、つまいづいたのでメモっておく。

mod_layoutの代替

サーバを移行するときなんかに新旧のサーバが一発でわかればいいなとおもって、HTMLとか挿入する方法ないかなと、mod_layoutを思い出した。

だけど、mod_layoutは開発がとまり、公式もなくなってるっぽいので使えず。

それの代替になるようなものないかなと探していたら、modextfilterなるモジュールがあるらしいので使ってみた。

やりたいこと

既存のHTMLを触らずにサーバ側でゴニョゴニョして任意のHTMLを挿入

modextfilterの導入

CentOS 6.4ではyumでインストールした時点でロードされていたので設定だけすます。

$ sudo cat /etc/httpd/conf/httpd.conf | grep mod_ext_filter
LoadModule ext_filter_module modules/mod_ext_filter.so

modextfilterの設定

httpd.confやVirtualHostのディレクティブに以下のように、定義と影響範囲の2つを書く。

定義はこんな感じ。

ExtFilterDefine overwriteext mode=output intype=text/html \
    cmd="/bin/sed -e s/置き換え対象の文字列/置き換え後の文字列/g"

ExtFilterDefineに続いて定義の名前、出力とその条件、処理という感じ。

次にLocationディレクティブで影響範囲と定義した名前を書く

  <Location />
    SetOutputFilter overwriteext
  </Location>

これでDocumentRoot直下のtext/htmlを吐くものに対し、cmdで処理されたものがアウトプットされる。

で、

こんなHTMLを直前に入れたいと思った

<p class="devMessage">Development Mode</p>

素直に入れてみる。

cmd="/bin/sed -e s/</body>/<p class="devMessage">Development Mode</p></body>/g"

Apache再起動。

リロード、表示されない

どうも、cmdの書式がまずい(タブルコーテーションがかぶってるとかエスケープできてないとか)とapacheを再起動した時点でsyntaxがおかしいとはいてくれるけど、sed的にまずいところがあってもエラーなく起動しちゃう上に、ブラウザでは真っ白になってしまうのでなかなか原因がつかめなかった。

結論からいくと、置換の区切り文字を変更してダブルコーテーションとスペースをエスケープすることで動くようになった。

こんなかんじにする。

cmd="/bin/sed -e s|</body>|<p\ class=\"devMessage\">Development\ Mode</p></body>|g"

これで、apacheモジュール書式的に問題ないし、sed的にも問題なく希望のHTMLが挿入できた。

ということで、mod_layoutを使うのはやめましょう。

modextfilterのほうが何倍も便利です。

modextfilter - Apache HTTP サーバ

サーバ構築の実際がわかる Apache[実践]運用/管理 (Software Design plus)
鶴長 鎮一
技術評論社
売り上げランキング: 19,707