refererとuseragentが記録されない
今日なんとなくApacheのログを眺めていると、ローカルリファレンスの画像はログを取らないように設定しているはずなのに、gifのアクセスログがときおり出力されていることに気付きました。
xxx.xxx.x.xx - - [21/Jun/2012:16:57:47 +0900] "GET /images/jp/top/bg-contents.gif HTTP/1.1" 200 608
ローカルリファレンスでログを取らないようにっていうのは%{referer}を参照して、それがローカルドメインだったらという設定をしています。ところがこのログをみると、レスポンスコード(200)と、取得サイズ(608)に続いてリファラーとユーザエージェントが続くはずなんですが、それがでていませんね。
ちなみに通常のログはこんな感じです。
xxx.x.xxx.xx - - [21/Jun/2012:16:57:47 +0900] "GET /hoge/fuga HTTP/1.1" 200 6721 "http://www.example.com/news/" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E)"
リファラーやユーザエージェントはリクエストする側がリクエストヘッダに入れる文字列なので任意のものに変更はできます。ゆえに、なにか不正な文字列を詰め込めば上記のようにリファラーやユーザエージェントをログに残さないようにすることも可能かもしれません。
ちなみにwgetならお手軽にそのあたりをセットしてリクエストをだすことはできますが、リファラーやユーザエージェントをのこさないようなリクエストをつくることはちょっと試した限りではできませんでした。
こんなコマンドラインだと
% wget --output-document=/dev/null --referer="^H" --user-agent="^H" http://www.example.com/
こんなログ出力。
XXX.XXX.XX.X - - [21/Jun/2012:17:25:24 +0900] "GET / HTTP/1.1" 200 9687 "\b" "\b"
拒否ることは簡単なんだけど。実際にrefererにはなにが入っているのかちょっと気になるところです。