我想配置httpd.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
,但一直无法使其正常工作。
非常感谢您的建议!
谢谢!
更新:回复 CK:
<Directory "/var/www/html">
Order allow,deny
Allow from all
</Directory>
更新 2:有人知道为什么这个指令匹配并拒绝像这样的url /_test.php
,而它显然不是一个“目录”?(我删除了<Files>
除.htaccess之外的所有部分。)
<Directory ~ "/[._]">
Order allow,deny
Deny from all
</Directory>
答案1
编辑:从评论回复来看,原始帖子不太正确 - 以下是新的重写规则集:
RewriteRule /\..+ - [F]
RewriteCond %{REQUEST_URI} ^/[^_]+/__\w+__\.\w+$ [NC]
RewriteRule ^ - [S=1]
RewriteRule /_.+ - [F]
这里的顺序很重要: - 首先禁止以句点 (.) 开头的任何内容 - 这是一条“全局”规则,没有特殊情况。 - 特殊情况是\w+.\w+ 必须被允许通过下一个 S=1 跳过下一个规则 - 禁止任何以下划线 (_) 开头的内容
答案2
听起来您正在寻找“DirectoryMatch 和 FileMatch”。
来自 apache httpd 网站。 http://httpd.apache.org/docs/2.0/mod/core.html#directorymatch
< DirectoryMatch> 和 </DirectoryMatch> 用于括起一组仅适用于指定目录及其子目录的指令,与 相同。但是,它以正则表达式作为参数。
http://httpd.apache.org/docs/2.0/mod/core.html#filesmatch
< FilesMatch> 指令通过文件名限制所附指令的范围,就像 < Files> 指令一样。但是,它接受正则表达式。
答案3
与大多数此类事情一样,规则的顺序至关重要。
我认为最好的经验法则是先考虑特殊情况的例外,然后再考虑一般情况的规则,如下所示:
- 允许匹配 (^|/)__\w+__.\w+$ 的文件
- 拒绝与 (^|/)[._] 匹配的文件或目录
如果顺序与上述相反,则文件匹配异常永远不会发生,因此不会产生任何影响。
顺便说一句,为什么要制定这样愚蠢的规则?为什么不把公共文件放在一个目录中,把私有文件放在另一个目录中?为什么将像“_private.txt”这样的私有文件放在名为 /public 的目录中?为什么要将公共文件和目录名称与私有名称如此相似?以更方便、更合理的方式做事会更有意义 - 有时最好的答案是 DDTT - “那就不要那样做”。