.htaccess 301重定向问题:排除目录后指定文件跳转失效
问题原因
你的第二条规则没生效,核心问题是mod_rewrite和mod_alias的执行顺序,以及第一条规则的[L]标志导致的:
- 第一条
RewriteRule属于mod_rewrite模块,执行优先级比mod_alias模块的Redirect指令高,会先处理请求。 - 当请求
/test.php时,第一条规则的!^c($|/)条件成立(/test.php不是以c开头),加上[L]标志会终止后续所有规则执行,第二条Redirect根本没机会触发。
解决方案
把所有重定向逻辑统一用mod_rewrite实现,并且调整规则顺序——先处理特殊的/test.php重定向,再处理全局重定向,保证特殊规则优先执行。
修正后的.htaccess配置:
RewriteEngine on # 优先处理/test.php的重定向 RewriteRule ^test\.php$ /c/test.php [L,R=301] # 排除/c/目录及其子内容,将其他请求重定向到b.example RewriteCond %{REQUEST_URI} !^/c($|/) RewriteRule ^ https://b.example/ [L,R=301]
规则说明
- 第一条
RewriteRule:精确匹配/test.php,直接重定向到/c/test.php,[L]标志确保这条规则执行后不再处理后续规则。 - 第二条通过
RewriteCond先判断请求路径是否不是以/c或/c/开头,满足条件时才执行重定向到b.example的规则。
内容的提问来源于stack exchange,提问作者simone71
相关产品推荐
相关产品推荐

