LoginSignup
4
6

More than 5 years have passed since last update.

LTSV形式のApacheアクセスログのステータスが、ブラウザが返すステータスと同じじゃない問題

Posted at

ある日のアクセスログ

とある日のこと、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にすることで解決しました。

httpd.conf
- 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

4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6