我有一条应用于 Apache 的 httpd.conf 配置的规则,如下所示:
<DirectoryMatch "^/.*/\..*/">
Order deny,allow
Deny from all
</DirectoryMatch>
它阻止访问我们 webroot 中的隐藏目录(例如 .git)。但是,我们使用的 Web 应用程序 (Magento) 使用媒体目录中需要公开访问的 .thumbs 子目录。
我有一条在 .htaccess 中有效的规则,明确禁止访问隐藏目录:
RewriteRule (^\.|/\.) - [F]
但我似乎找不到允许上述版本。
背景:我们不修改 Apache httpd.conf 配置文件的原因是我们希望仅通过基于代码的部署来解决这个问题,并避免在每个生命周期环境中重新加载 Web 服务器的配置。
答案1
...不修改 Apache
httpd.conf
配置文件
总结将以下内容添加到.htaccess
您想要允许访问的目录中的文件中,即/media/.thumbs/.htaccess
:
<Files "*">
Order deny,allow
Allow from all
</Files>
[F] 的反义词是什么(即禁止)...
您似乎问错了问题。您需要 (mod_authz_host) 的反面Deny
- 您需要覆盖它。(但是,处理指令的顺序还有进一步的复杂性,因此请继续阅读...)
(在旁边:该F
标志是 mod_rewrite 发送 403 Forbidden 响应的方式,实际上并没有对面的除了避免发送 403 Forbidden 之外,其他方法都行!如果请求已被 mod_authz_host 阻止(即Deny
),则无法使用 mod_rewrite“撤消”此操作。)
相反的Deny
操作Allow
在 mod_authz_host 中。例如,在/media/.thumbs/.htaccess
文件中,您可以执行以下操作:
Order deny,allow
Allow from all
但是,这不会覆盖<DirectoryMatch>
服务器配置中的容器,因为<DirectoryMatch>
容器被处理后 .htaccess
。但是,如果您<Directory>
在服务器配置中使用了(非正则表达式)容器,而不是<DirectoryMatch>
,那么这将覆盖服务器配置,因为<Directory>
容器和.htaccess
在同时使用.htaccess
覆盖<Directory>
容器。
不过,你仍然可以允许访问所有文件/media/.thumbs
通过将上述Allow
指令包装在<Files>
容器中(在同一个文件中)在子目录中执行.htaccess
此操作。例如:
<Files "*">
Order deny,allow
Allow from all
</Files>
通过将这些指令包装在<Files>
容器中,您可以改变处理的顺序。至关重要的是,<Files>
容器的处理后 <DirectoryMatch>
容器(尽管它出现在文件中.htaccess
),所以现在它会覆盖<DirectoryMatch>
服务器配置中的容器。
合并的顺序为:
<Directory>
(正则表达式除外)并.htaccess
同时完成(如果允许,使用 .htaccess 覆盖<Directory>
)<DirectoryMatch>
(和<Directory ~>
)<Files>
并<FilesMatch>
同时完成<Location>
并<LocationMatch>
同时完成
答案2
1º 不要使用 .htaccess
2º 在实际模式之前添加正则表达式“负向前瞻”以做出例外:
<DirectoryMatch ^/(?!\.thumbs).*/\..*/>
Order deny,allow
Deny from all
</DirectoryMatch>
答案3
您可以尝试以下操作:
RewriteCond %{REQUEST_FILENAME} !"path to.thumbs sub-directory"
RewriteRule (^\.|/\.) - [F]
阻止除指定文件夹之外的所有文件夹的访问。