hamuo的ブログ

hamuo的メモのスタンスとは違い、ブログ記事になりそうなのをこちらに書けていければな、と。というわけで記事の更新はかなり遅め。

apache 2.2.x にて SetEnvIf を使って and条件 を作るには

apache使ってると、「A and Bの条件、またはCの条件の時にログを分けたい」とあるのですが、SetEnvIfにてそれを実現するネタ。とりあえず例に出すの条件としては下記条件のいづれかを満たせばログを分ける設定という事で。

  • 「iOSのUA(UAiPhone,iPad,iPodが入ってる)」かつ「/api/ 配下へのアクセス」
  • UAは何でもよい」「/ios/ 配下へのアクセス」

これをSetEnvIfで書くとこうなる。

# iOS UA And /api/ Access
       SetEnvIf User-agent "(iPhone|iPod|iPad)" iOS_UA
       SetEnvIf Request_URI "^/(api)(/.*)?$" api_DIR

       SetEnvIf iOS_UA "^$" !api_DIR
       SetEnvIf api_DIR "1" iOS_log

# /ios/ Access
       SetEnvIf Request_URI "^/(ios)(/.*)?$" iOS_DIR
       SetEnvIf iOS_DIR "1" iOS_log

# If you fall into either of these conditions, distributes the log
       CustomLog /apache_log/ios/access_log logformat env=iOS_log
       CustomLog /apache_log/normal/access_log logformat env=!iOS_log
 

「"^$"」というのは、「環境変数に何も定義されてない」という条件に使うとの事。詳しいことはあとで追記しまっす。とりあえず、メモ代わりで。

個人的にはもう少しスマートに書けるんじゃないかなとは思ってはいますが…あと、Apache2.4からif文のディレクティブが強化されてるので、もっと書きやすいかも。まあnginxがもっと上を行ってるのかもしれないけど…