.htaccess配置带GET参数重定向到新域名规则失效问题
Apache RewriteRule 重定向不生效修复方案
你的规则不生效核心是4个基础逻辑错误:
- RewriteRule 仅匹配域名后、
?前的路径部分,不会匹配查询字符串(即?id=xxxxx段),你把参数写在Rule的匹配模式里永远匹配不到目标请求 - 若规则写在网站根目录
.htaccess文件中,匹配的路径不会带开头的/,你写的^/bn/前缀会直接匹配失败 - 跨域名跳转必须显式加重定向标记
R,仅加L只会触发服务器内部重写,不会返回跳转响应给浏览器,跨域场景下完全无法生效 - 正则中
.是通配符,匹配字面量.必须转义为\.,否则会出现非预期的误匹配
正确配置代码
以下是适配绝大多数虚拟主机场景(规则写在网站根目录.htaccess)的可用配置:
RewriteEngine On # 捕获查询字符串中的数字id参数 RewriteCond %{QUERY_STRING} ^id=([0-9]+)$ [NC] # 匹配目标路径,拼接捕获的参数做301跳转 RewriteRule ^bn/referral\.php$ https://www.newdomain.com/index.php?referral=%1 [NC,L,R=301]
注意:如果你的规则是直接写在Apache主配置/虚拟主机配置的非Directory块中,把Rule里的
^bn/改成^/bn/即可,其余部分无需调整。
关键规则说明
- 查询字符串中捕获的分组值,需要用
%1引用,$1仅能引用RewriteRule自身匹配模式里的分组内容 - 测试阶段建议先把
R=301改成R=302(临时跳转),避免301永久跳转被浏览器强缓存导致调试困难,确认跳转逻辑正常后再改回301 - 正则中
referral.php的.必须转义为\.,否则referral1php、referralXphp这类不符合预期的路径也会被规则匹配
仍不生效的排查方向
- 确认Apache已经启用
mod_rewrite模块,模块未开启时所有重写规则都不会执行 - 确认站点对应目录的配置中
AllowOverride设置为All,否则服务器不会读取目录下的.htaccess文件 - 清理浏览器缓存、CDN缓存后再测试,301跳转缓存会持续很久,容易误导调试结果
内容的提问来源于stack exchange,提问作者Da11aS
相关产品推荐
相关产品推荐

