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

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

我想配置httpd.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,但一直无法使其正常工作。

非常感谢您的建议!

谢谢!


更新:回复 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

与大多数此类事情一样,规则的顺序至关重要。

我认为最好的经验法则是先考虑特殊情况的例外,然后再考虑一般情况的规则,如下所示:

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

如果顺序与上述相反,则文件匹配异常永远不会发生,因此不会产生任何影响。

顺便说一句,为什么要制定这样愚蠢的规则?为什么不把公共文件放在一个目录中,把私有文件放在另一个目录中?为什么将像“_private.txt”这样的私有文件放在名为 /public 的目录中?为什么要将公共文件和目录名称与私有名称如此相似?以更方便、更合理的方式做事会更有意义 - 有时最好的答案是 DDTT - “那就不要那样做”。

相关内容