ある日のアクセスログ
とある日のこと、Apacheのアクセスログをtail
して見たところ、下記のようなログを発見しました。
status: 200
path: /hogehoge
あきらかに存在しないURLへのアクセスなのに200ステータスがログに残っている…だと…。
何かがおかしいと思い、原因を調査しました。
調査方法
まず実際に該当のアプリにアクセスし、存在しないパスにアクセスしてみます。アクセスしてみると、アプリ側で設定した「このページは存在しませんよ」的なエラーページが表示され、403エラーを返していることが確認できました。
そして、そのときのApacheのアクセスログを確認してみたのですが、やはりステータスは200となっています…。
アプリ側には問題なさそうなので、Apacheのログの設定に問題がありそうだと思い、調査しました。
ApacheのログをLTSV形式に変換するようLogFormatを設定していたため、おそらくそこに原因があると目星を付けたのです。
ApacheのログをLTSV形式に変換することのメリットについては、下記の記事などを参照していただければと思います。
apacheのログファイルをltsv形式でより便利に!! - Qiita
原因はLTSV形式に変換しているLogFormatの記述でした
調査した結果、ltsv形式に変換しているLogFormatの設定の記述を変更することで、アプリが返すステータスコードをログに残すことができました!
もともとの設定は、下記のようにltsv形式に変換する時に、statusの値を %sに指定していたのですが、これを%>sにすることで解決しました。
- LogFormat "status:%s\tsize:%b\treferer:%{Referer}i\tpath:%U……" apache-ltsv
+ LogFormat "status:%>s\tsize:%b\treferer:%{Referer}i\tpath:%U……" apache-ltsv
なぜ%>sにするとアプリが返すステータスコードになったのかというと、ltsv形式のログに整形する際、%sだと内部でリダイレクトされたリクエストは、元々の リクエストのステータスを返すそうです。
ブラウザが最終的に返すリクエストのステータスを返すのは、%>sだそうなので、こちらに修正することが解決することができました。
- %s
- HTTPステータス。内部でリダイレクトが起きていたら最初のステータス
- %>s
- リクエストに対して返すHTTPステータス
参考
mod_log_config - Apache HTTP サーバ バージョン 2.2
Apacheのログ出力の要点 - Qiita