本家のお世話-#4。

 本家のお世話-#3。でちらっと書いたhttpd.conf (Apacheバージョン2.2.17)の設定をちょっと変えてログを分ける件,実はこれ,うまくいくまで悩みまくった。
 だいたいネットの解説で書いてあるのは,たとえば外部からの画像ファイルに対するアクセスをログに記録させたくないとすると,
   SetEnvIfNoCase Request_URI “\.(gif|jpg|png|bmp|css|ico|swf)$” no_log
とやって,
   CustomLog “logs/access.log” combined env=!no_log
とすればいいよ,とかいうのだ。これは,確かにうまくいった。しかし,ここからハマった,ハマった。

 ところで余談だが,ネットの参考サイトで,\.(gif|jpg|png|bmp|css|ico|swf)$の正規表現の違っているところが多かった。ネット上って「悪貨が良貨を駆逐する」ところがあるから,よく参考にされるサイトが間違いを書くと,いつまでもそのままになってしまうところがあって怖い。
 それこそ一番のおおもとの用語 – Apache HTTP サーバ – 正規表現の例には,ちゃんと「例えば、 すべての “images” ディレクトリの下の、すべての .gif と .jpg ファイル は /images/.*(jpg|gif)$ と書くことができます。」と書いてくれているんだけどね。

 で,ハマったのはaccess.logに記載させないno_log群のローカルアクセスと外部アクセスを分けることでだった。しょっちゅうLAN内から自ブログにアクセスするので,しかも開発をやっているわけではないから,サーバの構成を大きく変えたときのエラーくらいしか必要がないので,LAN内からのアクセスはerror.log以外のログから除外してしまいたかったのだ。

 SetEnvIf ディレクティブのところを読んでみると,env-variableは何個並べてもいいことになっているので,
   SetEnvIfNoCase Request_URI “\.(gif|jpg|png|bmp|css|ico|swf|txt)$” images no_log
   SetEnvIf Remote_Addr “^192\.168” Local no_log
   CustomLog “logs/no_log.log” combined env=images
としてみた。no_logでないものについては特に定義しなくてもenv=!no_logだけで全部拾ってくれるんだから,これでいいだろうと思ったんだが,no_log.logに画像へのアクセスとローカルへのアクセスがどちらも記録されてしまう。

 いろいろ試してみたんだが,うまくいってみれば結局簡単なことで,SetEnvIfを使って定義したときには,そのグループに入らないものについては明示的に宣言してやらねばならないということだった。
 つまり,こう書けばいいのだ。
   SetEnvIfNoCase Request_URI “\.(gif|jpg|png|bmp|css|ico|swf|txt)$” images no_log
   SetEnvIf Remote_Addr “^192\.168” !images no_log
   CustomLog “logs/no_log.log” combined env=images

 これで,画像へのアクセスログだけが,no_log.logに記録される。ログがずいぶんすっきりなった。めでたし,めでたし。

 今回もつくづく思ったが,結局はオフィシャルサイトのマニュアルを地道に読むのが一番いいようだ。どこに書いてあるかわからなくて,探し出すのが大変なのが,玉にきずだが……

追記(4/20):
 今見直していたら, SetEnvIfNoCase Request_URI “\.(gif|jpg|png|bmp|css|ico|swf|txt)$” images no_log のところにtxtまで入ってるけど,これは自鯖の都合上で,txtファイルはもちろんimageファイルではない。言うまでもないけど,あえて,蛇足。(笑)