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

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

我想允许访问目录中被禁止的单个文件。

这不起作用:

<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我收到了目录的“禁止访问”消息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>

嵌套在目录中的文件将只应用于其中,因此您的代码块组织得更加合乎逻辑,我认为使用“满足任何”将允许它们按计划合并。我不确定这是否真的需要,所以尝试使用和不使用满足行...

答案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>

相关内容