禁止されている Apache ディレクトリ内の単一ファイルに基本認証を使用するにはどうすればよいでしょうか?

禁止されている Apache ディレクトリ内の単一ファイルに基本認証を使用するにはどうすればよいでしょうか?

通常は禁止されているディレクトリ内の 1 つのファイルへのアクセスを許可したいと思います。

これは機能しませんでした:

<VirtualHost 10.10.10.10:80>
  ServerName example.com

  DocumentRoot /var/www/html

  <Directory /var/www/html>
    Options FollowSymLinks
    AllowOverride None
    order allow,deny
    allow from all
  </Directory>

  # disallow the admin directory: 
  <Directory /var/www/html/admin>
    order allow,deny
    deny from all
  </Directory>

  # but allow this single file:: 
  <Files      /var/www/html/admin/allowed.php>
      AuthType basic
      AuthName "private area"
      AuthUserFile /home/webroot/.htusers
      Require user admin1
  </Files>

  ...
</VirtualHost>

アクセスすると、ディレクトリhttp://example.com/admin/allowed.phpの Forbidden メッセージは表示されますhttp://example.com/admin/が、基本認証からのブラウザ ログイン ポップアップは表示されないため、ファイルでは基本認証が機能しません。allowed.php に対して例外を作成するにはどうすればよいでしょうか?

不可能な場合は、別の Files ディレクティブですべての禁止ファイルを列挙できるでしょうか?

admin/ には、この仮想ホストで禁止する必要がある user.php と admin.php も含まれているとします。

編集:また、Ignacio の回答のアドバイスに従って、次の変更も試してみましたが、結果は同じ「禁止」でした。

  ...

  # disallow the admin directory: 
  <Directory /var/www/html/admin>
    order allow,deny
    deny from all
  </Directory>

  # but allow this single file:: 
  <Files      /var/www/html/admin/allowed.php>
      order allow,deny
      allow from all
      AuthType basic
      AuthName "private area"
      AuthUserFile /home/webroot/.htusers
      Require user admin1
      satisfy all
  </Files>
  ...

答え1

これを試して:

<Directory /var/www/html/admin>
  <Files allowed.php>
    AuthType basic
    AuthName "private area"
    AuthUserFile /home/webroot/.htusers
    Require user admin1
  </Files>
  order allow,deny
  deny from all
  satisfy any
</Directory>

ディレクトリ内にネストされたファイルはそのディレクトリ内でのみ適用されるため、コード ブロックはより論理的に整理され、「Satisfy any」を使用すると、計画どおりにマージできると思います。実際に必要かどうかはわかりませんので、satisfy 行の有無で試してみてください...

答え2

<Files xxx>この解決策が実際にうまく機能するかどうかはわかりません。ドキュメントページが必要適用されないと述べているFiles

Context:    directory, .htaccess

代わりに、Apache のドキュメントでは、ファイル用に別のディレクトリを作成することが提案されています。

サブディレクトリ内のコントロールを削除する

次の例は、Satisfy ディレクティブを使用して、保護されたディレクトリのサブディレクトリ内のアクセス制御を無効にする方法を示しています。この手法は、mod_authz_host によって課されるアクセス制御も無効にするため、注意して使用する必要があります。

<Directory /path/to/protected/>
    Require user david
</Directory>
<Directory /path/to/protected/unprotected>
    # All access controls and authentication are disabled
    # in this directory
    Satisfy Any
    Allow from all
</Directory>

関連情報