如何通过.htaccess正确实现带查询参数的301重定向
Apache .htaccess 带查询参数的301重定向正确配置
原有规则失效原因
之前编写的规则存在几个语法和逻辑问题,导致无法正常生效:
- 第一组规则将两条
RewriteCond判断写在同一行,Apache mod_rewrite模块要求每个条件判断必须单独占行,同行书写会直接导致条件匹配逻辑失效 - 第二组规则跳转目标域名错误(写为nalyvky.com,与目标域名不符),且未做查询参数丢弃处理,跳转后会自动携带原
?lang=1后缀,不符合无参数跳转的需求 - 跳转目标未携带
https://协议头,会被Apache识别为相对路径,触发异常的多级路径跳转 - 原规则中
^lang\=1$的查询参数匹配逻辑过于严格,当链接存在其他附加参数(比如?lang=1&from=home)时会直接匹配失败
可直接使用的稳定配置
将以下代码放在网站根目录.htaccess文件的最顶部,置于其他所有重写规则(如CMS、框架的默认路由规则)之前,避免被前置规则拦截:
<IfModule mod_rewrite.c> RewriteEngine On # 实现 about.php?lang=1 跳转至 /about RewriteCond %{HTTP_HOST} ^example\.com$ [NC] RewriteCond %{QUERY_STRING} (^|&)lang=1($|&) RewriteRule ^about\.php$ https://example.com/about? [L,R=301,NC] </IfModule>
规则说明
- 域名匹配条件加
[NC]标志,不区分域名大小写 - 查询参数匹配逻辑兼容lang=1在任意位置的情况:不管lang=1是第一个参数、中间参数还是最后一个参数都能正常匹配
- 跳转目标末尾的
?作用是丢弃原请求的所有查询参数,跳转后地址为干净的https://example.com/about,不会携带多余参数,该写法兼容Apache 2.2及以上所有版本,比仅用QSD标志适配范围更广 R=301标记为永久重定向,L标记匹配到该规则后停止执行后续重写逻辑,NC标记匹配about.php路径时不区分大小写
测试注意事项
- 测试前务必清空浏览器缓存,301永久重定向会被浏览器本地强制缓存,之前错误规则产生的缓存会导致测试结果失真
- 如果需要同时匹配带www和不带www的域名,可将域名判断条件修改为
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC],跳转目标对应修改为你需要的最终域名版本即可 - 禁止将多条
RewriteCond条件写在同一行,每条条件必须单独占行
内容的提问来源于stack exchange,提问作者nazz fardo
相关产品推荐
相关产品推荐

