子目录.htaccess加RewriteEngine On致根目录重写规则失效解决方法
问题根因
Apache 2.4 环境下,子目录中存在开启RewriteEngine On的.htaccess文件时,mod_rewrite模块默认会优先加载当前目录的重写规则,完全覆盖上级目录(含网站根目录)定义的所有重写规则,不会自动继承。
传统的RewriteOptions Inherit配置不生效的核心原因有两点:
- 该模式会将父目录继承来的规则插入到当前目录所有规则的末尾,若当前目录规则优先匹配并触发了带
L标识的终止逻辑,父级规则将完全没有执行机会 - 父目录中编写的RewriteRule匹配基准是网站根路径,继承到子目录后,匹配基准会切换为当前子目录路径,原有正则无法匹配相对路径,自然不会触发。
可行配置方案
二选一即可,优先推荐第一种方案,维护成本更低。
方案1:使用Apache 2.4专属继承规则(推荐)
Apache 2.3.10及以上版本(覆盖你使用的2.4.38环境)支持InheritBefore继承参数,作用是将父目录的所有重写规则插入到当前目录规则的最前端优先执行,同时自动修正路径匹配基准,不会出现路径错位问题。
在/wp-content/uploads/.htaccess中写入如下配置即可:
RewriteEngine On RewriteOptions InheritBefore
注意:如果
/wp-content/uploads/sites/、数字站点目录等更深层级的目录下也存在开启了重写引擎的.htaccess文件,每个对应层级的配置文件中都需要添加RewriteOptions InheritBefore配置,否则对应路径下的父级规则仍会被覆盖失效。
方案2:规则下沉至子目录(无继承依赖,稳定性最高)
如果不想依赖规则继承逻辑,可以将根目录的重写规则改写为适配子目录路径基准的版本,直接放到/wp-content/uploads/.htaccess中。子目录下的重写规则匹配的是相对于当前目录的路径,不需要写完整的目录前缀,改写后的规则如下:
RewriteEngine On RewriteCond %{REQUEST_URI} ^/wp-content/uploads/sites/[0-9]+/xxx_uploads/ [NC] RewriteRule ^sites/[0-9]+/xxx_uploads/(.*)$ /wp-content/files.php?file=xxx_uploads/$1 [R=302,L]
规则改动点说明:
- 匹配正则移除了前缀
wp-content/uploads/,直接从当前目录下的sites/路径开始匹配 - 重写目标路径前添加了根路径斜杠
/,避免Apache将目标地址解析为当前子目录下的相对路径,导致找不到files.php入口文件。
内容的提问来源于stack exchange,提问作者Marcin
相关产品推荐
相关产品推荐

