2009年10月28日水曜日
httpd.confのSetEnvIfの定義

ログ採取の条件を変更したかったので、あれこれ弄繰り回してたんだけど、なかなか…

自社のIPアドレスは除外
画像へのリクエストも除外

この条件があらかじめ設定されている状態だった。

SetEnvIf Remote_Addr XXX.XXX.XXX.XXX no_log
SetEnvIf Request_URI "\.(swf)|(jpeg)|(jpg)|(gif)|(css)|(txt)|(ico)$" no_log

CustomLog /home/www/logs/access_log combined env=!no_log

これで指定されたIPアドレス、画像の拡張子以外をaccess_logに書き込むようになる。

問題はここから。

ある特定のディレクトリだけは、別のログに書きたい。
なので、こうしてみた。

SetEnvIf Remote_Addr XXX.XXX.XXX.XXX no_log
SetEnvIf Request_URI "\.(swf)|(jpeg)|(jpg)|(gif)|(css)|(txt)|(ico)$" no_log
SetEnvIf Request_URI "^/abc/" no_log
SetEnvIf Request_URI "^/abc/" abc_log

CustomLog /home/www/logs/access_log combined env=!no_log
CustomLog /home/www/logs/abc_access_log combined env=abc_log

でもこれじゃダメ。
アクセスログでは除外してあったIPアドレスと画像のリクエストが抜かれていない。

ってことで色々調べてみたけど、なんだか上手くいかない。
正規表現だろってことで、"^/abc/"を否定してみたかったんだけど、上手くいかない(多分、僕の正規表現がまずかったのかな)。
そもそもenv=(env=!)が複数指定できないのが痛い。

mod_setenvif - Apache HTTP サーバ
ここにSetEnvIfの構文について書いてある。

SetEnvIf attribute regex [!]env-variable[=value] [[!]env-variable[=value]] ...

このenv-variableの指定の仕方について、こう書いてある。
これは、

varname
!varname
varname=value
のどれかの形式になります。

最初の形式では、値は "1" に設定されます。 二つ目はもし値が定義されていればそれを取り除きます。 三つ目は変数を value の与えられた値に設定します。 2.0.51 以降では、regex 内に $1..$9 が存在すればそれを認識し、regex の対応する丸括弧で囲まれた部分で 置換します。mod_setenvif - Apache HTTP サーバ


「!」をつけると単純に否定されるワケではなくて、あらかじめセットされているものから除外されるようになるってことかな?

まずはこれで、おおまかに採取したいログを定義する。
SetEnvIf Request_URI "^/abc/" abc_log

そのabc_logから除外したいものを選択する。
SetEnvIf Remote_Addr XXX.XXX.XXX.XXX !abc_log
SetEnvIf Request_URI "\.(swf)|(jpeg)|(jpg)|(gif)|(css)|(txt)|(ico)$" !no_log

そうすれば「/abc/」にあったリクエストから、特定のIPアドレスやURLが除外される、と。

ただ、このRequest_URIって、QUERY_STRINGが読めないみたいで、例えば画像を呼び出すだけのようなxxxx.php?image=test.jpgとかって来られると困るんだよなぁ。
これはmod_rewriteで対処できるようだけど、そこまでする必要があるのかどうか…



0 コメント | コメントを書く
Template Design: © 2007 Envy Inc.