Apache 配置:正则表达式禁用对以点开头的文件/目录的访问

Posted

技术标签:

【中文标题】Apache 配置:正则表达式禁用对以点开头的文件/目录的访问【英文标题】:Apache configuration: Regex to disable access to files/directories beginning with a dot 【发布时间】:2011-05-20 03:49:27 【问题描述】:

我想禁止访问任何名称以点开头的文件或目录。我想出了以下方法,但只有当它们直接位于 Document 根目录中时,它才会禁用对以 DOT 开头的文件/目录的访问。

<Files ~ "^\.|\/\.">
    Order allow,deny
    Deny from all
</Files>

有了这个,

http://my_server.com/.svn/entries   --> Permission denied
http://my_server.com/abcd/.svn/entries  --> Accessible, should be disabled

实现此目的的正确正则表达式是什么?

【问题讨论】:

【参考方案1】:

这对我来说非常有效(Apache 2.4):

<LocationMatch "\/\.">
    Require all denied
</LocationMatch>

拒绝任何包含以点(文件或目录)开头的组件的 URL。

【讨论】:

【参考方案2】:
RewriteRule (^\.|/\.) - [F]

这将拒绝查看以点开头的任何文件或目录。 它会影响路径树中的任何级别。

末尾的[F]修饰符表示禁止访问(L修饰符不需要说它是最后应用的规则,默认情况下是隐含的)。

正则表达式有两部分(任何一个都可以匹配,不需要两者都匹配):

(part1|part2)

第一部分匹配以点开头的任何内容(当您在每个目录的 .htaccess 文件中使用它并且我们匹配的字符串的开头不会有斜杠时):

^\.

例如,这适用于.test.git/HEAD 但不适用于/.gitpath/.hidden

第二部分匹配任何包含斜线和点的内容。如果您在 VirtualHost 或横向 Apache 配置中有此规则,这很有用,在这种情况下,我们匹配的字符串可能以斜杠开头。

此规则将匹配:/.gitsome/.hidden 此规则将不匹配:.git.hidden

当我们结合这两个规则时,似乎我们涵盖了所有可能的情况。

【讨论】:

【参考方案3】:

带重写模组:

RewriteEngine on

RewriteCond %THE_REQUEST ^.*/\.
RewriteRule ^(.*)$ - [R=404]

每个以点开头的文件或目录都将被重定向到 404。

/myDir/.svn => 404
/.gitignore => 404
/dir1/dir2/dir3/..../.toHide => 404

【讨论】:

【参考方案4】:

您的代码不起作用,因为&lt;Files&gt; 仅适用于所请求文档的基本名称。即最后一个斜线之后的部分。 (来源:http://httpd.apache.org/docs/current/mod/core.html#files)

Apache 在默认安装中阻止.htaccess 文件(更好的是:所有以.ht 开头的文件)。如果您仔细查看配置文件,您会看到如下内容:

<FilesMatch "^\.ht">
    Order allow,deny
    Deny from all
</FilesMatch>

所以要隐藏所有以点开头的文件,您可以使用:

<FilesMatch "^\.">
    Order allow,deny
    Deny from all
</FilesMatch>

为了使其适用于以点开头的目录,请使用以下(经过测试的)代码:

<DirectoryMatch "^\.|\/\.">
    Order allow,deny
    Deny from all
</DirectoryMatch>

【讨论】:

除了反复试验之外,还有其他方法可以测试这些正则表达式吗?他们似乎没有遵循我熟悉的 Regex 规则。例如。 ^/protected/.* 匹配 /protected/file.txt 和 ^/(folder1|folder2)/.* 不匹配 /folder1/file.txt 但 /folder1/.* 匹配。 我认为正斜杠不需要转义。另外,DirectoryMatch 正则表达式可以写成更紧凑的形式:&lt;DirectoryMatch "/\."&gt; 或类似以下内容以排除 .well-known &lt;DirectoryMatch "/\.(?!well-known)"&gt;。记得注意.well-known这个目录是标准化的,一般情况下不应该被禁止。

以上是关于Apache 配置:正则表达式禁用对以点开头的文件/目录的访问的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式 - 如何在搜索文件时防止或解决文件之间的干扰?

我可以使用啥正则表达式来匹配以点十进制表示法表示的任何有效 IP 地址?

如何创建文件名以点开头的 zip 文件

如何从目录中删除以点(。)开头的文件? [复制]

当此文件以点“。”开头时,C# 在 ftp 中读取文件(隐藏文件)[重复]

如何以点开头的rsync文件夹?