为何.htaccess重定向规则在子目录下无法生效?
问题原因及解决办法
原因
Apache的mod_rewrite默认不会将上级目录(根目录)的Rewrite规则自动继承到子目录。由于/d/目录下的.htaccess启用了RewriteEngine On,但未配置规则继承,导致根目录的重定向规则无法作用于/d/目录下的请求,所以针对/d/index.php?Itemid=111&board=100.300的重定向失效。
解决办法
方法一:让子目录继承根目录规则
在/d/.htaccess中添加RewriteOptions inherit,修改后的配置如下:
RewriteEngine On RewriteOptions inherit RewriteBase /d/ RewriteRule ^$ index.php [R=301,L]
此配置会让/d/目录的请求先应用根目录的Rewrite规则,再执行自身规则,根目录的重定向逻辑即可正常触发。
方法二:在子目录中添加重定向规则
直接将根目录的重定向规则复制到/d/.htaccess中,修改后的内容如下:
RewriteEngine On RewriteBase /d/ # 处理Itemid=111的重定向 RewriteCond %{QUERY_STRING} (.*)Itemid=111&(.*) [NC] RewriteRule .* /d/index.php?%2 [R=301,L] RewriteRule ^$ index.php [R=301,L]
这样/d/目录的请求会直接触发自身配置的重定向规则,无需依赖根目录的设置。
方法三:修改根目录规则(不推荐)
若不想修改子目录的.htaccess,可调整根目录规则并添加循环防护,但这种方式容易引发问题,仅作为备选:
# 排除已处理的请求,避免循环重定向 RewriteCond %{QUERY_STRING} !(.*)Itemid=111(.*) [NC,OR] RewriteCond %{REQUEST_URI} ^/d/index.php$ RewriteRule .* - [L] # 原重定向规则 RewriteCond %{QUERY_STRING} (.*)Itemid=111&(.*) [NC] RewriteRule .* /d/index.php?%2 [R=301,L]
内容的提问来源于stack exchange,提问作者Kornelius
相关产品推荐
相关产品推荐

