同时配置两条URL重定向规则时的优先级冲突问题求助
解决Apache重定向规则冲突:根路径与其他路径分别跳转的问题
这个问题的核心是mod_rewrite(RewriteRule)的执行优先级高于mod_alias(Redirect),而且你的第一条RewriteRule ^(.*)$会匹配所有请求(包括根路径/),所以即使你写了Redirect规则,也会被RewriteRule抢先处理。
下面给你两种可靠的解决方案,推荐第一种,用统一的mod_rewrite规则来避免模块间的优先级问题:
方案一:全用RewriteRule,按顺序匹配
把根路径的重定向规则放在最前面,并且加上[L]标志(表示匹配后停止执行后续规则),这样就能优先处理根路径的特殊跳转,再处理其他所有路径的通用跳转:
# 优先处理根路径请求(http://old.cz/) RewriteRule ^$ http://new.cz/specific-page/specific-page [R=301,L] # 处理所有非根路径的请求(比如http://old.cz/xxx/xxx) RewriteRule ^(.*)$ http://www.new.cz/$1 [R=301,L]
这里的^$精确匹配空字符串(对应根路径的请求,因为在根目录的.htaccess中,RewriteRule的匹配模式是去掉开头/的路径部分),所以只会触发根路径的跳转;剩下的所有请求都会被第二条规则捕获,跳转到对应的新路径。
方案二:混合使用时排除根路径
如果你坚持要保留Redirect规则,可以给第一条RewriteRule加上条件,排除根路径的请求,这样Redirect就能生效:
# 只处理非根路径的请求,排除http://old.cz/ RewriteCond %{REQUEST_URI} !^/$ RewriteRule ^(.*)$ http://www.new.cz/$1 [R=301,L] # 处理根路径的跳转 Redirect 301 / http://new.cz/specific-page/specific-page
重要提醒
因为301是永久重定向,浏览器会缓存跳转结果,测试新规则时记得清除浏览器缓存或者使用隐私/无痕模式,避免旧的缓存影响测试结果。
内容的提问来源于stack exchange,提问作者Tomáš Vavřinka
相关产品推荐
相关产品推荐

