ApacheのAllow, Denyディレクティブでand条件したい

追記: 2008-11-14

コメントで id:yasui0906 さんに教えてもらったように、

SetEnvIf X_CLIENT_TYPE "^(DoCoMo|EZWeb|ThirdForce)" is_mobile=1
SetEnvIf x-up-subno "XXXXXXXXXXXXX\.ezweb\.ne\.jp" my_ktai
SetEnvIf is_mobile "^$" !my_ktai

Order Deny,Allow
Deny  from all
Allow from env=my_ktai

な風にした方が env!= の列挙よりスマートです! 自分もこっち使うようにしました。



たとえば、自分の携帯電話(au)からのアクセスだけ許可したいときは、

CIDRFile "/usr/irori/etc/ip.d/[a-zA-Z]*"
SetEnvIf X_CLIENT_TYPE "^(DoCoMo|EZWeb|ThirdForce)" is_mobile

SetEnvIf x-up-subno  "XXXXXXXXXXXXX\.ezweb\.ne\.jp" my_ktai

なふうに、「携帯電話」はmod_cidr_lookupを使って判定して環境変数is_mobileをセットして、「自分の」はリクエストヘッダx-up-subnoが自分の携帯のサブスクライバIDと一致すれば環境変数my_ktaiをセットしておきます。

で、

Order Deny,Allow
Deny  from all
Allow from env=is_mobile AND env=my_ktai

みたいにAND条件でAllowしたいところなんですが、Allowの列挙はORになるのでできません。

くまったなーと思って mod_authz_host.c のソースをちら見してみると env=! なんていう否定表現があるではないですか。

なのでこれを使うと、

Order Allow,Deny          # 最初は全部拒否
Allow from all            # とりえず全部許可して、
Deny  from env=!is_mobile # 携帯じゃないのは拒否
Deny  from env=!my_ktai   # さらに、自分のじゃないのは拒否

な感じで実現できます。

他にもできる方法があったら教えてください><


ちなみに、Allow, Deny ディレクティブで env=! が使えるのは、Apache 2.2.10 と trunk だけのようです。2.2.9や現時点の2.0系では使えません。

あと、ドキュメントには英語版には記載されてますが、日本語訳の方には記載されてないので気をつけてください。