ziguzagu.org

MultiViewsMatchでハンドラをMultiViews検索に追加

前回のエントリーで海賊たろさんに教えてもらった、ApacheのMultiViewsで拡張子なしのURIを作る方法を試してみました。ただ、すんなりは行かなかったのでメモを。

最初は、ただ単純に.htaccessにOptionsでMutliViewsを追加しただけで試してみました。

Options +MultiViews +ExecCGI

これだけだと、.htmlなファイルは拡張子なしのURIでアクセスできるのですが、.cgiなファイルはNotFoundになってしまいました。なぜ…。あれやこれやと設定を勘でいじってみましたが、さっぱりわけがわからないので、もう一度腰をすえてじっくりApacheのコンテントネゴシエーションmod_mimeのマニュアルに目を通しました。そしてようやく答え発見。

MultiViewsで検索されるファイルタイプは、MultiViewsMatchディレクティブで指定されているファイルタイプから検索される、というものでした。

MultiViewsMatchは、デフォルトでは「NegotiatedOnly」という値になっていて、 mod_mimeが認識するファイル(mime.typesなどに登録してあるファイルタイプ)だけを検索します。

この時点で何も見つからなければNotFoundになってしまうのですが、このMultiViewsMatchにはハンドラやフィルタなどに指定されているファイルタイプも検索するようにできます。今回はハンドラとして登録してある.cgiなファイルをMultiViews検索したいので、こんな設定でうまくいきます(した)。

AddHandler cgi-script .cgi
Options +MultiViews +ExecCGI
MultiViewsMatch Handlers

これでCGIも拡張子なしでアクセスできます。また、この後ろにPATH_INFOとして渡したいものをいっぱいつけても、階層に関係なくちゃんとapp.cgiを探してくれます。たとえば、

http://example.com/app/index/search

というURIでも、app.cgiを実行しつつ/index/searchをPATH_INFOとして渡してくれます。かっこいい!

でも、なんか結局いろいろファイル検索するので重くなっちゃうんじゃないだろうか?ていう不安&疑問があったりもしますが、とりあえずはこれで。簡単だし。

追記:MultiViewsMatchディレクティブはApache2.0以降で使えるディレクティブです。Apache1.3系ではMultiViewsを有効にした場合、2.x系でMultiViewsMatch anyとしたのと同じ状態になります。