我想configurationhttpd.conf拒绝符合以下任一项的文件:
. 或_ . 或_ ,但不匹配__\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式。
像大多数这样的事情,规则的顺序是至关重要的。
国际海事组织的最佳经验法则是首先将特例例外,然后是一般情况下的例外规则,如下所示:
如果顺序与上面相反,那么文件匹配exception甚至不可能达到,所以不会有任何影响。
顺便说一句,为什么有这样愚蠢的规则? 为什么不把公共文件放在一个目录中,私人文件放在另一个目录呢? 为什么私人文件像“_private.txt”在一个名为/ public的目录中? 为什么让你的公共文件和目录名称如此烦人地类似于你的私人名字? 以更方便,明智的方式做事情会更有意义 – 有时最好的答案是滴滴涕 – “不要那样做,那么”。