13

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

我试图用<Directory(Match)>指令来做到这一点。服务器配置(000-sites-enabled)如下所示:

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)>指令似乎实际上匹配目录和文件!?

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

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

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

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

4

6 回答 6

18

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

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

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

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

这与<DirectoryMatch>它将
匹配树中的所有文件和目录覆盖
树 中任何项目的所有或指令形成对比。<Files><Directory>

于 2011-03-21T01:21:43.733 回答
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>

于 2011-03-13T23:13:17.687 回答
1

用这个:

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


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

您可能想要添加选项等。

诀窍是指令是如何合并的

于 2011-03-20T14:38:01.413 回答
0

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

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

至于您关于限制对子目录的访问的观点,我会查看另一篇文章。...也许没有帮助。也许更多细节到您的用例会有所帮助。

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

于 2011-03-13T22:36:01.097 回答
0

最好的方法是将所有不向公众提供的内容移动到根树之外的目录中,例如 /home/my/app/

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

然后在该目录和通向该目录的所有目录中授予 Apache 用户读取权限,例如 /home 和 /my

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

于 2011-03-13T23:00:32.623 回答
0

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

httpd.conf:

...
Options FollowSymLinks
...

(没有设置“索引”选项。)

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

Options Indexes

请注意,这将递归地影响其目录及其所有子目录,因此您应该通过添加和禁用自动索引来.htaccess排除任何您不希望在其上使用此选项的递归子目录:.htaccess

Options -Indexes

注意:要.htaccess启用文件并影响 apache 配置,您应该AllowOveride All在要放置.htaccess文件的目录上匹配。

于 2014-04-08T13:06:49.637 回答