記事一覧:2009年01月14日

さくらのレンタルサーバーでmod_rewriteにハマる

 さくらのレンタルサーバーは、Apacheのmultiviews機能が有効化されている。これにより、たとえば「http://ほげほげ/hoge」というURLにアクセスした場合、「http://ほげほげ/hoge.html」を自動的に返してくれるようになっている。

 ところが、この機能はmod_rewriteと組み合わせると非常に気持ち悪い動作をしてくれる。たとえば、mod_rewriteで下記のように設定したとしよう。

RewriteEngine on
RewriteBase /
RewriteRule ^/(.*)$ test.cgi/$1 [L]

 この設定は、「http://ほげほげ/foo/bar/」というURLでアクセスした場合、「http://ほげほげ/test.cgi/foo/bar」というURLの内容を返す、という動きを意図している。ところが、この場合なぜかInternal Server Errorになってしまう。どうも、multiviewsが勝手に拡張子を補完してしまうのがよろしくないようだ。しょうがないので、下記のように設定して解決した。

RewriteEngine on
RewriteBase /
RewriteRule ^/([^.]*)$ test.cgi/$1 [L]
RewriteRule ^/([^.]*)(.html|.rss20|.atom)$ test.cgi/$1$2 [L]

 勝手に変な拡張子を加えられるのが問題なので、とりあえず「.」を含むURLはRewriteしないように設定する。これだけだと.htmlや.rss20、.atomといった拡張子付きのURLがRewriteされないので、個別に拡張子を指定してRewriteするようにした。