我想允许访问目录中被禁止的单个文件。
这不起作用:
<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>