必须用[qsa]:当路径重写后目标脚本需读取原始get参数时,如rewriterule ^/?receiver.php$ /otherfolder/receiver.php [qsa,l],否则$_get为空;它自动追加问号后全部内容,比手动引用%{query_string}更安全可靠。
![apache 中 rewriterule 怎么使用 [qsa] 标记保留原始的 query string 参数](https://img.php.cn/upload/article/001/242/473/179012834949090.jpg?x-oss-process=image/resize,p_40)
直接加 [QSA] 就行,不需要手动捕获或拼接原始参数。它会让 Apache 自动把用户请求 URL 中问号(?)后面的所有内容,原样附加到重写后的目标路径末尾。
什么时候必须用 [QSA]
只要目标脚本需要读取原始的 GET 参数,比如 ?name=alice&token=abc,而你又做了路径重写(例如从 /receiver.php 映射到 /otherfolder/receiver.php),就必须加 [QSA]。否则,目标脚本收到的 $_GET 是空的。
RewriteRule ^/?receiver\.php$ /otherfolder/receiver.php [QSA,L]- 访问
/receiver.php?name=alice&token=abc→ 实际执行的是/otherfolder/receiver.php?name=alice&token=abc - 没加
[QSA],就只会执行/otherfolder/receiver.php,参数全丢了
和正则捕获一起用也不冲突
比如要把 /product/123 转成 product.php?id=123,同时还要保留可能带的额外参数(如 /product/123?ref=ad):
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
RewriteRule ^product/([0-9]+)/?$ product.php?id=$1 [QSA,L]-
$1提取路径中的数字,[QSA]自动追加原始查询字符串 - 结果就是
product.php?id=123&ref=ad(注意 & 会被正确解析,不是被截断)
别和 %{QUERY_STRING} 混着写
有人会误写成这样:RewriteRule ^search.html$ search.php?%{QUERY_STRING} [L]。这看似能传参,但其实有风险:
- 如果原始 URL 是
search.html?q=hello world,%{QUERY_STRING}的值是q=hello world,空格不会被编码,可能导致解析失败 - 而
[QSA]内部会做标准 URI 编码处理,更安全可靠 - 除非你要修改、过滤或重组参数(比如删掉某个键),否则不用手动引用
%{QUERY_STRING}
常见错误提醒
以下写法都不对:
-
RewriteRule ^page.html\?(.*)$ page.php?$1 [L]——?在正则里要转义,且 Apache 不推荐在 pattern 中匹配?,应改用RewriteCond %{QUERY_STRING}配合[QSA] -
RewriteRule ^page.html$ page.php [QSA,L]却忘了加[QSA]—— 最容易忽略,一丢参数就查半天 - 多个
[QSA]连写,比如[QSA,QSA,L]—— 重复无效,一个就够了










