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
但不适用于/.git
、path/.hidden
。
第二部分匹配任何包含斜线和点的内容。如果您在 VirtualHost 或横向 Apache 配置中有此规则,这很有用,在这种情况下,我们匹配的字符串可能以斜杠开头。
此规则将匹配:/.git
、some/.hidden
此规则将不匹配:.git
、.hidden
当我们结合这两个规则时,似乎我们涵盖了所有可能的情况。
【讨论】:
【参考方案3】:带重写模组:
RewriteEngine on
RewriteCond %THE_REQUEST ^.*/\.
RewriteRule ^(.*)$ - [R=404]
每个以点开头的文件或目录都将被重定向到 404。
/myDir/.svn => 404
/.gitignore => 404
/dir1/dir2/dir3/..../.toHide => 404
【讨论】:
【参考方案4】:您的代码不起作用,因为<Files>
仅适用于所请求文档的基本名称。即最后一个斜线之后的部分。 (来源: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 正则表达式可以写成更紧凑的形式:<DirectoryMatch "/\.">
或类似以下内容以排除 .well-known <DirectoryMatch "/\.(?!well-known)">
。记得注意.well-known这个目录是标准化的,一般情况下不应该被禁止。以上是关于Apache 配置:正则表达式禁用对以点开头的文件/目录的访问的主要内容,如果未能解决你的问题,请参考以下文章
我可以使用啥正则表达式来匹配以点十进制表示法表示的任何有效 IP 地址?