我有一个适用于我的Apache的httpd.confconfiguration的规则,如下所示:
<DirectoryMatch "^/.*/\..*/"> Order deny,allow Deny from all </DirectoryMatch>
它阻止访问隐藏的目录,如我们的webroot中的.git。 但是,我们使用的Web应用程序(Magento)使用媒体目录中的需要公开访问的.thumbs子目录。
我有一个在.htaccess工作明确禁止访问隐藏的目录的规则:
RewriteRule (^\.|/\.) - [F]
但我似乎无法find上述行的允许版本。
上下文:我们不修改Apache httpd.confconfiguration文件的原因是我们希望只用基于代码的部署来解决这个问题,并且需要在每个生命周期环境中重新加载Web服务器的configuration。
…不修改Apache
httpd.confconfiguration文件
tl; dr将以下内容添加到要允许访问的目录中的.htaccess文件中。 /media/.thumbs/.htaccess :
<Files "*"> Order deny,allow Allow from all </Files>
什么是[F]的反义词(即禁止)…
你似乎在问错误的问题。 你需要相反的Deny (mod_authz_host) – 这是你需要重写。 (但是,处理指令的顺序还有更多的复杂性,所以请继续阅读…)
( 另外: F标志是mod_rewrite发送一个403 Forbidden响应的方式,除了避免发送一个403 Forbidden!以外,并没有真正的相反 ,如果请求已经被mod_authz_host(即Deny )阻塞,那么你不能用mod_rewrite“撤消”这个。)
Deny的对面是Allow in mod_authz_host。 例如,在/media/.thumbs/.htaccess文件中,可以这样做:
Order deny,allow Allow from all
但是,这不会覆盖服务器configuration中的<DirectoryMatch>容器,因为<DirectoryMatch>容器是在 .htaccess 之后处理的。 但是,如果您在服务器configuration中使用了(非正则expression式) <Directory>容器,而不是<DirectoryMatch> ,则会覆盖服务器configuration,因为<Directory>容器和.htaccess会同时处理用.htaccess覆盖<Directory>容器。
但是,仍然可以通过将上述Allow指令包装在<Files>容器(在相同的.htaccess文件中)来允许访问/media/.thumbs子目录中的所有文件。 例如:
<Files "*"> Order deny,allow Allow from all </Files>
通过将这些指令包装在<Files>容器中,您正在改变处理的顺序。 最重要的是, <Files>容器在 <DirectoryMatch>容器之后进行处理(尽pipe它出现在.htaccess文件中),所以现在它覆盖了服务器configuration中的<DirectoryMatch>容器。
从关于如何合并部分的Apache 2.2文档 :
合并的顺序是:
<Directory>(正则expression式除外)和.htaccess同时完成(使用.htaccess,如果允许,覆盖<Directory>)<DirectoryMatch>(和<Directory ~>)- 同时完成
<Files>和<FilesMatch><Location>和<LocationMatch>同时完成
1º不要使用.htaccess
2º在实际模式之前添加正则expression式“negative lookahead”以作例外:
<DirectoryMatch ^/(?!\.thumbs).*/\..*/> Order deny,allow Deny from all </DirectoryMatch>
你可以试试这个:
RewriteCond %{REQUEST_FILENAME} !"path to.thumbs sub-directory" RewriteRule (^\.|/\.) - [F]
阻止除指定文件夹以外的所有文件夹的访问。