使用apache2服务器配置匹配/拒绝所有子目录的访问

时间:2011-03-09 21:37:10

标签: apache apache2 wildcard subdirectory server-configuration

如何拒绝访问给定目录的所有子目录? (允许手动修改目录树中单个项目的访问权限。)

我试图用<Directory(Match)>指令来做。服务器配置(启用了000个站点)如下所示:

DocumentRoot /var/www
<Directory /var/www>
    Allow from all
    Deny from none
    Order deny,allow
</Directory>
<Directory /var/www/*>
    Deny from all
</Directory>

http://localhost/的查询成功显示/var/www/index.html,并且对所有子目录的所有查询都失败。

问题是:对httproot中文件的任何查询都失败 - 即请求http://localhost/index.html将导致403 Forbidden

<Directory(Match)>指令似乎与目录AND文件匹配!?

为了确定这是否属实,我试过:

<Directory /var/www/i*>
    Deny from all
</Directory>

这拒绝只访问以“i”开头的文件/目录。

有没有办法改变这种行为,让<Directory>只匹配目录?还有另一种方法可以实现所有子目录被拒绝吗? (除了手动拒绝所有文件或手动启用所有文件)

6 个答案:

答案 0 :(得分:16)

最后,解决方案变得非常简单:

<Directory /var/www/*/>
    Allow from None
    Order allow,deny
</Directory>

注意目录模式之后的尾部斜杠/,这将使它只匹配目录,而不是文件!

这与我们对<Directory> - 指令的期望完全一样,因为它拒绝仅访问/var/www/的直接子目录。 仍然可以使用<Directory>指令手动重新启用指定的子目录(树中的任何位置)。

这与<DirectoryMatch>相反   - 还匹配所有文件&amp;树中的目录
  - 覆盖树中任何项目的所有<Files><Directory>指令。

答案 1 :(得分:3)

这对我有用。

<DirectoryMatch "^/var/www/(.+)/"> # don't put $ at the end
Order Allow,Deny
Deny From All
</DirectoryMatch>

<小时/> 修改

为了不拒绝子子目录(下面的注释),在配置文件中添加上面的DirectoryMatch:

<DirectoryMatch "^/var/www/(.+?)/(.+)/"> # again no $, see comment
Order Deny,Allow
Allow From All
</DirectoryMatch>

答案 2 :(得分:1)

使用此:

<Directory /var/www/public>
    allow from all
</Directory>


<DirectoryMatch "^/var/www/public/(.+)/">
   deny from all
</DirectoryMatch>

您可能想要添加选项等。

技巧是how the directives are merged

答案 3 :(得分:0)

所以,我有两个可能有帮助(或没有)的想法。

首先,位置可以覆盖您的目录权限。所以一定要确保没有。点击localhost /正在点击你设置为root的任何内容,这可能会覆盖你的安全性。这就是为什么如果直接指定文件,你就无法实现它。因此,如果您不希望人们能够访问您的根,you should not specify a root

关于限制访问子目录的观点,我会查看其他帖子。 ......也许没用。也许更多关于您的用例的细节会有所帮助。

https://serverfault.com/questions/190447/apache-2-htaccess-matching-all-sub-directories-of-current-directory

答案 4 :(得分:0)

最好的方法是将公众无法使用的所有内容移动到根树之外的目录,例如/ home / my / app /

<Directory /home/my/app>
    Order Allow,Deny
    Deny from all
</Directory>

然后为该目录中的Apache用户以及通向该用户的所有目录提供读取权限,例如/ home和/ my

这样,当发生某些根目录配置错误时,不存在某些内容泄露的风险。

答案 5 :(得分:0)

您可以通过从配置文件中的Indexes指令中删除Options选项来禁用所有子目录中的自动索引,因此对于默认配置,Options指令应如下所示:

的httpd.conf:

...
Options FollowSymLinks
...

(未设置“索引”选项。)

然后,将index.htmlindex.php文件放在您希望可供客户端访问的每个特定子目录中。 如果要在某个特定目录中启用自动索引,可以在这些目录中添加.htaccess个文件,并将此行放在.htaccess文件中:

Options Indexes

请注意.htaccess会对其目录及其所有子目录产生递归影响,因此您应该通过添加{来排除任何不希望使用此选项的递归子目录。 {1}}并通过以下方式禁用自动索引:

.htaccess

注意:要启用Options -Indexes个文件并对apache配置生效,您应该在目录上.htaccess匹配您要放置AllowOveride All文件。