多域名重定向时保持url参数不丢失的关键是使用[qsa]标志:rewriterule ^/(.*)$ https://www.example.com/$1 [r=301,l,qsa];servername仅用于主机名匹配,不参与重定向;redirect指令不支持qsa,需用rewritecond+rewriterule手动拼接查询字符串。

多域名重定向时保持 URL 参数不丢失,关键不是 ServerName 本身——它只是声明虚拟主机响应哪个主机名,不参与参数传递——而是重定向规则中是否显式保留查询字符串(query string)。Apache 默认在外部重定向([R])时会丢弃原始请求的参数,除非你主动处理。
确保重定向携带原始参数的写法
使用 RewriteRule 配合 [QSA](Query String Append)标志是最直接有效的方式:
-
RewriteRule ^/(.*)$ https://www.example.com/$1 [R=301,L,QSA]→ 将所有路径连同原始 ?key=value 一起带到目标域名 - 若只改域名、不动路径和参数,也可简写为:
RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC]RewriteRule ^(.*)$ https://www.example.com$1 [R=301,L,QSA]
避免常见错误:不要依赖默认行为
以下写法会丢失参数:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
RewriteRule ^/(.*)$ https://www.example.com/ [R=301,L]→ 结尾的/截断了路径,更不用说参数 -
RewriteRule ^/old\.php$ https://www.example.com/new.php [R=301,L]→ 即使原请求是/old.php?id=123,重定向后也只剩https://www.example.com/new.php
ServerName 和重定向的关系要理清
ServerName 只用于匹配 Host 请求头,决定由哪个 <virtualhost></virtualhost> 处理请求。它本身不生成重定向。真正做跳转的是 RewriteRule 或 Redirect 指令。所以:
- 多个域名共用一个
DocumentRoot时,ServerName和ServerAlias列出所有合法域名即可 - 若需强制统一到某一个域名(如都跳到
www.example.com),就在该虚拟主机内用RewriteCond判断%{HTTP_HOST},再用带[QSA]的RewriteRule跳转
补充:用 Redirect 指令时如何保参?
Redirect 本身不支持 [QSA],但 RedirectMatch 可以通过正则捕获并显式拼接:
-
RedirectMatch 301 ^/(.*)$ https://www.example.com/$1→ 这个能保留路径,但不自动带查询串 - 要保参,必须写成:
RewriteCond %{QUERY_STRING} ^(.+)$RewriteRule ^/(.*)$ https://www.example.com/$1?%1 [R=301,L]→ 手动捕获并追加%1(即 %{QUERY_STRING} 的值)










