Apacheでアクセス制限をする

Apacheでアクセス制限をしようと頑張った結果こうなりました.

1. やりたいこと


私がやりたかったのは以下のことです.

  • /docroot はアクセス制限有り.
  • /docroot/foo はアクセス制限有り.
  • /docroot/bar はアクセス制限無し(省略.

ここでのアクセス制限とは,192.168.0.0/24なら自由にアクセスできる,ただしそれ以外の場合はBASIC認証が必要というやつです.

また,/docroot/{foo,bar}は指定した拡張子(ここでは.htmlと.php)のみ外部から参照できます.

2. 勘違いしてたこと


アクセス制限がホスト制限と認証しかないということです.
とかとかはただ単にその2種類の制限を操作するかどうかのif文でしかなかった,というのに気付くのにえらい時間がかかってしまいました.

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の様に最後にバックスラッシュが付いていない場合にアクセスできません.
なぜならにfooとしてマッチしてしまうからです.
そこで,にしてもいいのですが,よくわからないので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がからんでたりするのでちょっと違うかもしれないです.

7. 関係ないこと

httpd.confを0から書くというのをやってみたらおもしろかったです.
Apache3.0になるとこの辺をもっときれいに書けるみたい?


参考書:Apache公式サイト
Apacheセキュリティ
Apacheクックブック