htaccess 301重定向时旧路径被追加为参数,如何避免?
解决301重定向后旧路径被追加为参数的问题
这问题我之前也碰到过,大概率是你的Redirect指令被服务器上的其他重写规则(比如mod_rewrite的规则)干扰了,导致请求还没完成301跳转,就被内部转发到了deeplink.php,旧路径也就被当成参数带过去了。给你几个靠谱的解决办法:
1. 改用mod_rewrite写301(最推荐)
放弃Redirect指令,用mod_rewrite的规则来实现301,同时加上L标志(表示Last,处理完这条规则就停止后续逻辑),能彻底避免被其他规则干扰。把下面的代码放到你的.htaccess或者服务器配置文件里:
RewriteEngine On RewriteRule ^stellenangebote-berlin$ http://mydomain.de/stellenangebote-in/berlin [R=301,L]
^stellenangebote-berlin$精准匹配旧路径,确保不会误匹配其他类似URL[R=301,L]里的L是关键,它会告诉服务器处理完这个重定向后,不再执行后面的任何规则,自然就不会触发把请求转到deeplink.php的逻辑了
2. 调整规则顺序
如果你坚持要用Redirect指令,那一定要把它放到所有内部重写规则的前面。比如你的配置里如果有类似这样的规则:
RewriteRule ^(.*)$ deeplink.php?path=$1 [L]
那必须把Redirect 301 "/stellenangebote-berlin" "http://mydomain.de/stellenangebote-in/berlin"放在这条规则的上方,让服务器先处理重定向,再处理内部转发。
3. 测试前清空缓存
注意!301是永久重定向,浏览器会缓存这个结果,哪怕你修改了规则,可能还是会看到旧的跳转效果。测试的时候可以用:
- 浏览器的隐私/无痕窗口
- 用curl命令测试(更准确):
curl -I http://your-old-domain/stellenangebote-berlin,看返回的Location头是不是正确的目标URL
为什么原来的写法会出问题?
Redirect属于mod_alias模块,它的处理优先级通常比mod_rewrite的规则低。如果服务器上有把所有请求转发到deeplink.php的RewriteRule,那么请求会先被内部重写,旧路径被塞进path参数,之后才会触发Redirect——这时候跳转的目标就变成了带参数的deeplink.php,而不是你想要的干净URL。
内容的提问来源于stack exchange,提问作者Daniel Apps
相关产品推荐
相关产品推荐

