.htaccessのmod_rewriteで気をつける点

スイス製アーミーナイフこと、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は使えないという結論になる。私の場合がこれだった。

参考資料

  1. http://www.asi.co.jp/techinfo/unix/webserver.html
  2. http://php.birdlab.com/memo/16
  3. http://httpd.apache.org/docs/2.2/ja/mod/core.html
  4. http://httpd.apache.org/docs/2.2/ja/howto/htaccess.html

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください