我想禁止访问任何文件OR目录,其名称以DOT开头。我想出了以下内容,但只有当它们直接位于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
正确的正则表达式是什么?
谢谢,
JP
答案 0 :(得分:51)
您的代码不起作用,因为<Files>
仅适用于所请求文档的 basename 。也就是说,最后一次斜线之后的部分。 (来源: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>
答案 1 :(得分:17)
RewriteRule (^\.|/\.) - [F]
这将拒绝查看以dot开头的任何文件或目录。 它会影响路径树中的任何级别。
最后的正则表达式有两个部分(任何一个都允许匹配,不需要两者兼有):
(part1|part2)
第一部分匹配从dot开始的任何内容(对于在每个目录.htaccess文件中使用它的情况,在我们匹配的字符串的开头没有斜杠):
^\.
例如,这适用于.test
,.git/HEAD
但不适用于/.git
,path/.hidden
。
第二部分匹配包含斜杠后跟点的任何内容。如果您在VirtualHost或侧面Apache配置中有此规则,这很有用,我们匹配的案例字符串可能以斜杠开头。
此规则将匹配:/.git
,some/.hidden
此规则不匹配:.git
,.hidden
当我们将这两个规则结合起来时,我们似乎涵盖了所有可能的情况。
答案 2 :(得分:2)
这对我来说很完美(Apache 2.4):
<LocationMatch "\/\.">
Require all denied
</LocationMatch>
拒绝包含以点(文件或目录)开头的组件的任何URL。
答案 3 :(得分:1)
使用重写mod:
RewriteEngine on
RewriteCond %{THE_REQUEST} ^.*/\.
RewriteRule ^(.*)$ - [R=404]
以点开头的每个文件或目录都将重定向到404。
/myDir/.svn => 404
/.gitignore => 404
/dir1/dir2/dir3/..../.toHide => 404