Apache2.2で利用されていallow, denyなどの構文はApache 2.4では非推奨で代わりにRequireを使います。
許可するIPを記述するには
require ip 192.168.0.2
拒否するIPを記述するには
<RequireAll>
Require all granted
Require not ip 192.168.0.2
</RequireAll>
Apache2.4ではRequireを使う
アクセス制御を行うAllowやDenyはapache2.4からはRequireを使います。
例えば下記のような設定です。
order deny,allow #deny該当なし→許可、次にdeny該当 & allowに該当→許可
deny from all #全てdeny→ 全部allowを評価しに行く
allow from 192.168.0.2. # 192.168.0.2に該当したら許可。つまりこのIP以外は拒否
apache 2.4ではRequireAny中でいずれか許可設定にマッチする場合に許可します。
<RequireAny>
require all denied
require ip 192.168.0.2
</RequireAny>
この設定は以下の行だけで機能します。RequireAnyがデフォルト動作で条件にマッチしたものを許可する設定のためrequire all deniedは不要です。
require ip 192.168.0.2
RequireAllとRequireNoneディレクティブについて
デフォルトのRequireAny以外にRequireAllとRequireNoneがあります。
各ディレクティブについては公式のドキュメントを参考にしてください(私は英文読解力がなくてよくわかりませんでした…)
参考:Apache.org: Apache Module mod_authz_core
Apache.org: Access Control
- RequireAny (default)
- いずれかの許可設定にマッチすれば許可 (しなければ拒否 )
- RequireAll
- 全条件にマッチすればアクセス許可
- RequireNone
- いずれかの条件にマッチすれば拒否
RequireAnyでは基本拒否で許可設定を入れてどれかにマッチすれば許可する設定です。
なのでRequire all deniedは不要です。逆にRequire all grantedを入れると全てが許可設定にマッチするので全許可になります(意味がない)
<RequireAny>
require all granted →全許可がマッチするので全て許可される
require ip 192.168.0.2
</RequireAny>
RequireNoneはRequireAnyの逆で基本全許可でnotの条件を書いてマッチしたら拒否するというものになります。しかし下記の条件ではエラーになります。<RquireAll>のディレクティブ内で使用するように注意されます(RequireAny内では使えない)
<RequireNone>
require not ip 192.168.0.2
</RequireNone>
そしてnot ipでは該当しない場合になるためそのIPは拒否されません(RequireNoneではnotはエラーになる)。実際は下記のようになります。
<RequireAll>
Require all granted
<RequireNone>
Require ip 192.168.0.2
</RequireNone>
</RequireAll>
これで192.168.0.2は拒否、それ以外は許可になります。
SetEnvIfと組み合わせてUser-Agentなどのヘッダー情報を使って拒否や許可設定も可能です。
Bot・クローラーからのアクセスの見分けて除外して拒否する