我继承了一个设计不佳的网络应用程序,其中有一个需要公开访问的文件,但该文件位于不应该公开访问的目录中。
换句话说,我需要一种方法来阻止目录内的所有文件和子目录,但对单个文件覆盖它。
我正在尝试这个:
# No one needs to access this directly
<Directory /var/www/DangerousDirectory/>
Order Deny,allow
Deny from all
# But this file is OK:
<Files /var/www/DangerousDirectory/SafeFile.html>
Allow from all
</Files>
</Directory>
但它不起作用——它只是阻止了所有内容,包括我想要允许的文件。有什么建议吗?
答案1
StackOverflow 上有一个答案可以回答这个问题,我认为Order
嵌套Files
指令中缺少了一个?
答案2
# No one needs to access this directly
<Directory /var/www/DangerousDirectory/>
Order Deny,allow
Deny from all
</Directory>
# But this file is OK:
<Files /var/www/DangerousDirectory/SafeFile.html>
Order Deny,Allow
Allow from all
</Files>
如果该目录受密码保护,Satisfy any
也请添加。
答案3
虽然答案很晚,但或许仍是一个答案。
标签在目录范围内,不应具有完整路径。因此它应为:
<Directory "/var/www/DangerousDirectory">
Order Deny,allow
Deny from all
# But this file is OK:
<Files "SafeFile.html">
Allow from all
</Files>
</Directory>
请注意,这将允许该目录树中任何名为 SafeFile.html 的文件。
答案4
当访问受 HTTP 密码限制时允许特定文件。请注意,密码保护是根据文件系统定义的,而特定允许的文件由 URI 定义。已针对 Apache 2.4 更新。
<Directory /path/to/directory/>
AuthName SecureArea
AuthType Basic
AuthUserFile /path/to/passwd-file
Require user my-user
SetEnvIf Request_URI "path/to/uri-allowed-1.php" allowedURL
SetEnvIf Request_URI "path/to/uri-allowed-2.php" allowedURL
Require env allowedURL
</Directory>