スイス製アーミーナイフこと、URLを弄る万能兵器mod_rewriteを、最近良く触ることがあるので、それについてまとめておく。
httpd.confのすすめ
mod_rewriteなどの処理は、出来るなら.htaccessではなく、httpd.confに直書きした方が良いらしい。
httpd.confに直書きできる権限があるなら、httpd.confによって.htaccessを無効にする設定へ変更することも可能だろう。.htaccessを使わず、httpd.confに直書きするならば、.htaccessの機構自体を無効にしたほうが良いらしい。
理由
AllowOverride ディレクティブが .htaccess ファイルの設定を許可している場合は、Apache は 各ディレクトリで .htaccess ファイルを探します。 ですから、.htaccess ファイルを許可すると、実際に使用しているか どうかに関わらず、性能の低下を招くことになります! さらに、Apache は適用すべきディレクティブを集めるために、すべての 上位のディレクトリの .htaccess ファイルを探す必要があることにも 注意してください。引用
httpd.confを編集してその設定を読み込ませるために、apacheの再起動が必要だというのは有名な話であるが、逆にそれが功を奏するようだ。つまり、httpd.confが読み込まれるのは、apacheの起動時のみである。一方、.htaccessは上記の引用通り、アクセスがあるたびに探すという無駄が生まれる。その点でも注目されたい。
無効にするコード
<Directory /> AllowOverride None </Directory>
動かない!時のトラブルシューティング
私がやたらgoogle先生で調べたことの受け売りなため、ほぼ全て机上の空論な点に注意。実際に運用してみれば、別問題が発覚するかもしれない。ここでは、基本、レンタルサーバなどでhttpd.confが弄れない環境を想定している。
mod_rewriteの確認
一番面倒でない方法は、以下のコードを書いた.phpファイルにアクセスしてみることである。その中で、mod_rewriteと検索してみてなければ、ロード自体がされていないことになる。こうなると、もう打つ手なしである。
<?php phpinfo(); ?>
httpd.confの確認
ここでも、mod_rewriteがロードされているかどうかを読み取ることが出来るが、上記の方が手軽である。
まず、サーバのどこにapacheがインストールされているかでhttpd.confの場所が違うので、findコマンドあたりで探してみる。私が今回、色々と試行錯誤して結局(httpd.confの設定のせいで)出来なかったサーバだと、以下のところに存在した。
/usr/local/etc/apache/httpd.conf
mod_rewriteを使用するには、以下のことが最低限許可(記述)してなければならないようだ。
AllowOverride FileInfo Options +FollowSymLinks
1行目もしくは2行目が記述されていれば良い。3行目が記述されてなくても、.htaccessの先頭で同じことを記述してやれば動くこともあるようだ。動かない場合については後述する。
httpd-error.logの確認
以上の方法でどうしても動かない、403、500エラーが出る、などの場合はエラーログを読んでみる。apacheのログは、理解しやすく読みやすかったので、まずは実際に読んで見ることをオススメする。ログは、apacheの設定しだいで場所がかわるので、これも探す必要がある。私の場合は以下だった。
/var/log/httpd-error.log
動かない理由はログを読めばほぼ分かるが、ここではひとつだけ取り上げておく。「.htaccessにおいてOptionsが許可されていません」という趣旨のメッセージが出ることがある。それは、.htaccessにおいてOptionsが使えない設定になっていることを表しているわけだが、そもそもの設定でFollowSymLinksが許可されていないから.htaccessで許可してやらなければいけないわけで、その前提が崩されてしまう。という訳で、httpd.confで、FollowSymLinksも.htaccessでOptionsを使用することも禁止されている場合、mod_rewriteは使えないという結論になる。私の場合がこれだった。