qsa标志确保重写时原始查询参数不被覆盖而与新参数合并。其原理是当substitution含?时,qsa将原query string追加至?后以&分隔;若无?则自动保留原参数,qsa非必需。

QSA(Query String Append)标志是 Apache mod_rewrite 中处理查询参数的关键机制,它确保原始 URL 的 query string 不被覆盖,而是与重写目标中手动添加的参数合并。正确使用 QSA 能避免搜索词丢失、登录态中断、UTM 追踪失效等常见问题。
QSA 的作用原理
默认情况下,RewriteRule 的 substitution 部分若含 ?xxx,会完全替换原始 query string。QSA 则强制将原参数追加到 substitution 的 ? 后,以 & 分隔。例如:
- 请求:
/search?q=linux&page=2 - 规则:
RewriteRule ^search$ /search.php?src=apache [QSA,L] - 结果:
/search.php?src=apache&q=linux&page=2
注意:QSA 只在 substitution 中出现 ? 时才生效;若 substitution 无 ?,原始 query string 会自动保留,此时 QSA 非必需。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
常见误用场景与修正
以下写法会导致参数丢失,需立即规避:
-
错误:直接拼接参数但不加 QSA
RewriteRule ^/user/(\d+)$ /profile.php?id=$1&v=2 [R,L]
→ 原始 ?ref=abc 会被丢弃 -
正确:用 QSA 显式合并
RewriteRule ^/user/(\d+)$ /profile.php?id=$1&v=2 [QSA,R,L] -
错误:条件判断后未统一处理 query string
RewriteCond %{QUERY_STRING} ^ref=([a-z]+)$<br>RewriteRule ^/item/(\d+)$ /item.php?id=$1&ref=%1 [R,L]
→ 若原始 URL 是/item/100?ref=abc&sort=price,sort 会丢失 -
正确:改用 QSA 并移除手动 ?
RewriteCond %{QUERY_STRING} ^ref=([a-z]+)$<br>RewriteRule ^/item/(\d+)$ /item.php?id=$1&ref=%1 [QSA,R,L]
结合 RewriteCond 动态注入参数
当需根据 query string 内容决定是否添加新参数时,QSA 仍适用:
- 目标:对含
phone=的首页请求,跳转至/default/myaction_phone?company=1并保留原参数 - 配置:
RewriteEngine On<br>RewriteCond %{QUERY_STRING} ^phone=([^&]*)<br>RewriteRule ^/$ /default/myaction_phone?company=1&phone=%1 [QSA,R,L]<br>RewriteRule ^/$ /default/myaction?company=1 [R,L] - 说明:第一条规则匹配
?phone=123时,生成?company=1&phone=123,再由 QSA 补上其余参数(如&utm_source=ad)
调试与验证要点
启用 QSA 后务必验证参数完整性:
- 用
[R=302]替代[R=301]测试,防止浏览器缓存错误跳转 - 检查 Apache 错误日志:
LogLevel alert rewrite:trace3(2.4+)可输出每步重写过程 - 确认 RewriteRule 的 pattern 不含 query string——它只匹配路径部分,query string 必须用
%{QUERY_STRING}在 RewriteCond 中捕获 - 避免在 .htaccess 中漏写
RewriteBase /(尤其在子目录部署时),否则相对路径可能错位影响 QSA 行为










