Apacheでリライトを使う場合、ログを確認したいことがあります。
リライトのログの設定方法と出力の方法を紹介します。
結論から言うと、Apache 2.4ではRewriteLogとRewriteLogLevelは廃止されており、代わりにhttpd.confにLogLevel alert rewrite:trace3のように書きます。
出力先はErrorLogで指定しているエラーログ(error.logやapache_error.log)です。
2.2以前のRewriteLog・RewriteLogLevelをそのまま2.4に書くと「Invalid command ‘RewriteLog’」でApacheが起動しなくなるため、バージョンに合わせて書き分けます。
リライトの出力方法
# **** ログの出力 ****
# rewrite logの出力
<IfVersion < 2.3>
# version 2.2
LogLevel warn
RewriteLogLevel 9
RewriteLog "C:/MAMP/logs/rewrite.log"
# Mac,Linux
# RewriteLog "/Applications/MAMP/logs/rewrite.log"
</IfVersion>
<IfVersion > 2.3>
# version 2.4
LogLevel debug rewrite:trace8
</IfVersion>
Apacheのバージョンによって書き換える必要があります。
IfVersionというディレクティブでバージョンを指定できます(mod_versionが有効なときだけ使えます。2.4では標準で組み込まれています)。
2.2の場合、RewriteLogLevelを設定できます。
9が最も細かくログが出力される状態です。
その内容が、RewriteLogで指定しているパスに書き込まれます。
Apacheには2.3の安定版はありません。
Apache 2.4の場合、上の書き方は使えませんが、LogLevelにモジュール名をつけたrewrite:trace8という書き方で代用できます。
レベルはtrace1〜trace8までで、trace8が最も細かくログが出力される状態です。
デバッグする際にはtrace8に設定します。
それ以外のときは、trace1〜trace3程度で十分です(公式のマニュアル例はtrace3です)。
Apache 2.4ではリライト専用の出力先は選べず、ErrorLogで指定したエラーログに出力されます。
trace系のログは1リクエストごとに大量に書き込まれ、本番環境ではディスクを圧迫したり処理が遅くなったりします。
原因が分かったらLogLevel warnに戻しておきます。
.htaccessでは設定できない
LogLevelはサーバー設定かVirtualHostの中にしか書けないため、.htaccessにLogLevel alert rewrite:trace3と書いても「LogLevel not allowed here」で500エラーになります。
レンタルサーバーなどhttpd.confを触れない環境では、リライトログの代わりにRewriteRuleの末尾に[R=302,L]を一時的につけてリダイレクト先を目で確認するか、ローカルのMAMPやDockerで同じ.htaccessを再現して確認します。
ログファイルの場所の確認の仕方は、Apacheログの場所と確認方法|error.log・access.log・LogLevel設定を参考にしてみてください。
LogLevelをどの場所に書けるかは、Apacheのディレクティブとコンテキストとはで整理しています。
Apacheのバージョンの確認方法
MAMPを使っている場合、以下のようにServerRootを探します。
#windows
ServerRoot "C:/MAMP/bin/apache"
#Macなど
ServerRoot "/Applications/MAMP/Library"
ServerRootは、Apacheがインストールされているディレクトリと思いましょう。
windowsなら、ServerRootの中のbinの中のhttpd.exeです。
Macなら、ServerRootの中のbinの中のapachectlです。
#windows
C:/MAMP/bin/apache/bin/httpd.exe -v
#Macなど
/Applications/MAMP/Library/bin/apachectl -v
などで確認できます。
ログの読み方
trace以上のレベルにすると、1リクエストごとに次のような行がエラーログに出ます。
[rewrite:trace3] [pid 1234] mod_rewrite.c(480): [client 127.0.0.1:50000] 127.0.0.1 - - [localhost/sid#...][rid#...] applying pattern '^old/(.*)$' to uri 'old/page'
[rewrite:trace2] ... rewrite 'old/page' -> 'new/page'
[rewrite:trace1] ... pass through /var/www/html/new/page
「applying pattern」がどのRewriteRuleを試したか、「rewrite A -> B」が書き換えが成立したこと、「pass through」が書き換えなしで通過したことを表します。
意図したRewriteRuleの「applying pattern」が出ていない場合は、その前のRewriteCondで条件が不成立になっています。
RewriteCondの条件の書き方はApache RewriteCondの書き方・使い方、RewriteRuleの基本はRewriteRuleでURLを書き換える方法と意味を参考にしてみてください。