如何用子目录.htaccess覆盖根目录FilesMatch规则以允许twig文件访问?
解决主题目录下Twig文件的访问权限问题
问题背景
主网站及shop子目录的Drupal站点根目录.htaccess均包含以下规则,直接拒绝访问.twig后缀的文件:
<FilesMatch "\.(engine|inc|install|make|module|profile|po|sh|.*sql|theme|twig|tpl(\.php)?|xtmpl|yml)(~|\.sw[op]|\.bak|\.orig|\.save)?$|^(\.(?!well-known).*|Entries.*|Repository|Root|Tag|Template|composer\.(json|lock)|web\.config)$|^#.*#$|\.php(~|\.sw[op]|\.bak|\.orig|\.save)$"> <IfModule mod_authz_core.c> Require all denied </IfModule> <IfModule !mod_authz_core.c> Order allow,deny </IfModule> </FilesMatch>
主题目录已自定义.htaccess拒绝products.json和README.md的访问,现在需要允许同一目录下的cell.html.twig文件被访问,但此前添加的规则无法生效:
<Files cell.html.twig> order allow,deny allow from all </Files>
解决方案
根目录规则同时适配了新的mod_authz_core模块和旧版权限指令,因此需要用对应指令覆盖两种场景。将以下规则添加到主题目录的.htaccess中(建议放在现有规则之前):
<Files cell.html.twig> <IfModule mod_authz_core.c> Require all granted </IfModule> <IfModule !mod_authz_core.c> Order allow,deny Allow from all </IfModule> </Files>
原因说明
- 多数现代Apache环境默认启用
mod_authz_core模块,此时根目录用Require all denied限制访问,旧版Order/Allow指令不会生效,必须用Require all granted明确允许访问。 - 针对未启用
mod_authz_core的旧环境,保留Order allow,deny+Allow from all的规则确保兼容性。 - Apache的.htaccess规则按顺序匹配,将允许规则放在前面可优先覆盖上级目录的限制。
内容的提问来源于stack exchange,提问作者stckvrw
相关产品推荐
相关产品推荐

