Apache

【Apache】リライトのログの出力方法と設定方法

Apacheのリライト(mod_rewrite)のログを出力する設定方法を紹介します。2.2のRewriteLog・RewriteLogLevelと、2.4のLogLevel rewrite:traceの書き分け、出力先、ログの読み方を解説します。

この記事の目次
  1. リライトの出力方法
  2. .htaccessでは設定できない
  3. Apacheのバージョンの確認方法
  4. ログの読み方

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を書き換える方法と意味を参考にしてみてください。

スポンサーリンク