基于文件和目录名称的Apache访问限制

我想configurationhttpd.conf拒绝符合以下一项的文件:

  1. 以开头的目录._
  2. 一个以文件开始的文件._ ,但不匹配__\w+__\.\w+

例如:

 /_private/anything -> deny (rule 1) /_private/__init__.py -> deny (rule 1) /_private/_private.txt -> deny (rule 1+2) /public/_private.txt -> deny (rule 2) /public/__private.txt -> deny (rule 2) /public/__public__.txt -> allow 

我一直在使用<Directory ~ "..."><Files ~ "...">以及RewriteRule ,但一直没有得到正确的工作。

build议非常感谢!

谢谢!


更新:针对CK:

 <Directory "/var/www/html"> Order allow,deny Allow from all </Directory> 

更新2:有没有人知道为什么这个指令匹配和拒绝像/_test.php ,当它显然不是一个“目录”的url? (我删除了除.htaccess之外的所有<Files>部分。)

 <Directory ~ "/[._]"> Order allow,deny Deny from all </Directory> 

编辑:从评论回复原帖不太正确 – 下面是新的重写规则集:

 RewriteRule /\..+ - [F] RewriteCond %{REQUEST_URI} ^/[^_]+/__\w+__\.\w+$ [NC] RewriteRule ^ - [S=1] RewriteRule /_.+ - [F] 

顺序在这里很重要: – 禁止任何以(。)开始的任何事物 – 它是一个没有特殊情况的“全局”规则。 – 必须允许\ w + 。\ w +的特殊情况通过下一个S = 1跳过下一个规则 – 禁止任何以下划线(_)开头的规则

这听起来像你正在寻找“DirectoryMatch和FileMatch。

从Apache的httpd网站。 http://httpd.apache.org/docs/2.0/mod/core.html#directorymatch

<DirectoryMatch>和</ DirectoryMatch>用于包含一组指令,这些指令仅适用于该目录的命名目录和子目录,与之相同。 但是,它以正则expression式作为参数。

http://httpd.apache.org/docs/2.0/mod/core.html#filesmatch

<FilesMatch>指令通过文件名限制所附指令的范围,就像<Files>指令一样。 但是,它接受一个正则expression式。

像大多数这样的事情,规则的顺序是至关重要的。

国际海事组织的最佳经验法则是首先将特例例外,然后是一般情况下的例外规则,如下所示:

  1. 允许匹配(^ | /)__ \ w + __。\ w + $的文件
  2. 拒绝匹配的文件或目录(^ | /)[._]

如果顺序与上面相反,那么文件匹配exception甚至不可能达到,所以不会有任何影响。

顺便说一句,为什么有这样愚蠢的规则? 为什么不把公共文件放在一个目录中,私人文件放在另一个目录呢? 为什么私人文件像“_private.txt”在一个名为/ public的目录中? 为什么让你的公共文件和目录名称如此烦人地类似于你的私人名字? 以更方便,明智的方式做事情会更有意义 – 有时最好的答案是滴滴涕 – “不要那样做,那么”。