Apacheでアクセス制限をする
Apacheでアクセス制限をしようと頑張った結果こうなりました.
1. やりたいこと
私がやりたかったのは以下のことです.
- /docroot はアクセス制限有り.
- /docroot/foo はアクセス制限有り.
- /docroot/bar はアクセス制限無し(省略.
ここでのアクセス制限とは,192.168.0.0/24なら自由にアクセスできる,ただしそれ以外の場合はBASIC認証が必要というやつです.
また,/docroot/{foo,bar}は指定した拡張子(ここでは.htmlと.php)のみ外部から参照できます.
2. 勘違いしてたこと
アクセス制限がホスト制限と認証しかないということです.
3. アクセス制限書く
Order Deny,Allow Deny from All Allow from 192.168.0.0/24 AuthUserFile /path2pass AuthName "Nyan" AuthType Basic require valid-user Satisfy Any
4. 拡張子の制限を書く
Order Deny,Allow Deny from All Satisfy All Order Deny,Allow Allow from All Satisfy Any Order Deny,Allow Allow from All Satisfy Any
ちなみに,""はttp://example.com/foo/の様にDirectoryIndexを省略した時用です.
5. モウヒトコエ
ただし上記のままではttp://example.com/fooの様に最後にバックスラッシュが付いていない場合にアクセスできません.
なぜなら
そこで,
Order Deny,Allow Allow from All Satisfy Any
6. 最後に
これだとttp://example.com/fooでアクセスできますが,ttp://example.com/foo/fooにもアクセスできてしまいます.
なので,次のやつを書きました.
Order Deny,Allow Deny from All Satisfy All
これでだいたいうごくとおもいます.
ちゃんと動いていなかったり,もっと上手い方法がある,まちがってる,とか教えていただけるとうれしいです.
mod_rewriteとかでできそう?
あと,私が実際にやった環境ではVirtualHostがからんでたりするのでちょっと違うかもしれないです.