Apache的.htaccess语法中的(即禁止)的反义词是什么?

我有一个适用于我的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文档 :

合并的顺序是:

  1. <Directory> (正则expression式除外)和.htaccess同时完成(使用.htaccess,如果允许,覆盖<Directory>
  2. <DirectoryMatch> (和<Directory ~>
  3. 同时完成<Files><FilesMatch>
  4. <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] 

阻止除指定文件夹以外的所有文件夹的访问。