さくらのレンタルサーバーで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するようにした。