使用mod_rewrite重写URL后配置301跳转出现额外参数怎么办
问题原因
你混用了mod_alias模块的Redirect指令和mod_rewrite模块的RewriteRule指令,两类指令的执行优先级不同:mod_rewrite的规则执行优先级高于mod_alias,且跳转后的请求会再次进入重写规则匹配流程。
具体执行逻辑如下:
- 用户访问
/page/example-old/,先匹配到Redirect规则,跳转到/page/example-new/ - 跳转后的新请求再次命中
RewriteRule ^/?page/([a-z0-9\-]*)/ /page.php?url=$1 [L]规则,默认会把重写产生的url参数拼接到最终URL中,就出现了你看到的多余参数。
正确配置方案
建议统一使用mod_rewrite实现所有规则,同时调整规则顺序,将301跳转规则放在通用重写规则之前,配合标识实现无多余参数跳转:
# 首先配置单条301跳转规则 RewriteRule ^/?page/example-old/$ /page/example-new/ [R=301,L,QSD] # 原有通用重写规则放在跳转规则之后 RewriteRule ^/?page/([a-z0-9\-]*)/ /page.php?url=$1 [L]
配置说明
- 跳转规则放在最前,匹配到旧路径后直接跳转,
L标识会终止后续重写规则的执行,不会触发后面的通用重写逻辑 QSD(Query String Discard)标识会自动丢弃所有查询参数,避免参数拼接。如果你使用的是Apache 2.4以下版本,不支持QSD标识,可以将跳转目标末尾加?,写法为RewriteRule ^/?page/example-old/$ /page/example-new/? [R=301,L],末尾的?会自动消去原有参数,且不会出现在最终的跳转URL中- 配置修改完成后需要重载Apache配置生效,测试阶段建议先用
R=302临时跳转验证,确认规则无误后再改为R=301永久跳转,避免浏览器缓存旧规则影响测试。
内容的提问来源于stack exchange,提问作者coding_newbie
相关产品推荐
相关产品推荐

