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系では使えません。