特定ディレクトリのみBasic認証を解除してIP制限をかける

要件

  • ドキュメントルート(/var/www/html) 配下にBasic認証をかける
    • ただし、特定ディレクトリ(/var/www/html/secret) 配下は、Basic認証でなく、IP制限とする

Apache HTTP Server 2.2

ググると、だいたいこんなやつがでてくる。

<Directory "/var/www/html">
  AuthType Basic
  AuthName "basicauth"
  AuthUserFile /etc/httpd/.htpasswd
  Require valid-user
</Location>

<Directory "/var/www/html/secret">
  Order deny,allow
  Deny from all
  Allow from xxx.yyy.zzz.nnn
  Satisfy Any
</Directory>

これだと、指定IP以外からのアクセスでも、Basic認証が通れば/secretが開ける ( Satisfy Any なので )。 現実的には問題無いかもだけれど、どうやってググっても、要件を満たすようなやり方(/secret以下はBasic認証を外す方法)が見つからないゾ……

Apache HTTP Server 2.4

<Directory "/var/www/html">
  AuthType Basic
  AuthName "basicauth"
  AuthUserFile /etc/httpd/.htpasswd
  Require valid-user
</Location>

<Directory "/var/www/html/secret">
  # デフォルトでAuthMerging Offなので
  # 明示的に書かなくても同じこと
  AuthMerging Off
  Require ip  xxx.yyy.zzz.nnn
</Directory>

AuthMerging Off のおかげで、サブディレクトリのディレクトリで新しくRequire hogehoge を書けば、 親ディレクトリのRequireが打ち消されて要件が満たせるゾ。