如何在其他禁止的 Apache 目录中对单个文件使用基本身份验证?

mit*_*mit 6 security virtualhost http-authentication apache-2.2

我想允许访问在其他情况下被禁止的目录中的单个文件。

这不起作用:

<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>
Run Code Online (Sandbox Code Playgroud)

当我访问时,http://example.com/admin/allowed.php我收到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>
  ...
Run Code Online (Sandbox Code Playgroud)

小智 13

尝试这个:

<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>
Run Code Online (Sandbox Code Playgroud)

嵌套在目录中的文件仅适用于其中,因此您的代码块更有条理地组织起来,我认为使用“满足任何”将允许它们按计划合并。我不确定它是否真的需要,所以尝试使用和不使用满足行...