htaccess中Mod Rewrite导致301 Redirect异常附加参数问题咨询
解决301 Redirect与Mod Rewrite冲突导致跳转带额外参数的问题
我之前也踩过这个一模一样的坑!你遇到的问题本质是Apache处理mod_alias的Redirect指令和mod_rewrite的RewriteRule时的优先级与参数传递逻辑导致的:
你的RewriteRule ^directory/(.*).html$ /directory/controller.php?section=directory&page=$1 [L]会先把/directory/oldpage.html重写成带参数的内部请求,而Redirect 301触发时,Apache会默认把原请求(包括重写后的参数)附加到目标URL后面,所以就出现了/directory/newpage.html?section=directory&page=oldpage这种情况。
给你两个靠谱的解决办法:
方法一:用RewriteRule实现301重定向(推荐)
直接把301重定向用RewriteRule来写,并且把这个规则放在你现有的controller重写规则前面,这样能完全控制跳转目标,避免参数被自动附加:
# 先处理301重定向,[L]标志会终止后续规则执行 RewriteRule ^directory/oldpage.html$ /directory/newpage.html [R=301,L] # 原来的controller重写规则放在后面 RewriteRule ^directory/(.*).html$ /directory/controller.php?section=directory&page=$1 [L]
这个方法逻辑清晰,而且RewriteRule默认不会附加原查询参数(除非主动加[QSA]标志),能完美解决问题。
方法二:用RedirectMatch并手动丢弃参数
如果你坚持要用mod_alias的指令,可以用支持正则的RedirectMatch,并且在目标URL末尾加一个?,这样Apache就不会把原查询参数带过去了:
RedirectMatch 301 ^/directory/oldpage.html$ /directory/newpage.html?
最后提醒一句:测试301重定向时一定要清空浏览器缓存!因为301是永久重定向,浏览器会缓存跳转规则,哪怕你改了.htaccess,可能还是会看到旧的跳转结果。
内容的提问来源于stack exchange,提问作者B6431
相关产品推荐
相关产品推荐

