apache url重写中参数传递的关键是区分原始请求参数与重写构造参数,并通过qsa、b等标志位及正则捕获自动处理,避免丢失、冲突或循环。

Apache URL 重写中参数传递的关键,是区分“原始请求里的参数”和“重写后要追加/构造的参数”,并确保它们不丢失、不冲突、不循环。核心不是手动拼接,而是靠标志位和正则捕获自动处理。
原始查询参数(?key=value)要自动保留
当用户访问 /receiver.php?name=alice&token=abc,你希望它内部映射到 /otherfolder/receiver.php,但又不想丢掉 name 和 token —— 这时必须用 [QSA] 标志:
- RewriteRule ^/?receiver\.php$ /otherfolder/receiver.php [QSA,L]
- QSA(Query String Append)会把原始 ? 后面所有内容原样附加到目标路径后,最终效果等同于访问 /otherfolder/receiver.php?name=alice&token=abc
- 没有 QSA,目标脚本将收不到任何 GET 参数
从路径中提取值作为新参数传给脚本
比如把 /product/123 映射为 product.php?id=123,需要靠正则捕获 + 反向引用:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- RewriteRule ^product/([0-9]+)/?$ product.php?id=$1 [L]
-
([0-9]+)捕获路径中的数字,$1在目标里代表这个值 - 如果还想保留原始查询参数(如 /product/123?ref=ad),就补上 [QSA,L]
避免参数被双重编码或破坏特殊字符
当路径或参数含空格、&、/ 等符号(如 /search?q=hello world&cat=tech),默认重写可能误解析。这时加 [B] 标志:
- RewriteRule ^search/(.*)$ search.php?q=$1 [B,QSA,L]
- B(Escape Backreferences)会对 $1 中的非字母数字字符做 URI 编码,防止 & 被当成参数分隔符、空格被截断
- 尤其在转发含用户输入的搜索词、JSON 片段时建议启用
排除真实文件/目录,防止参数传递进死循环
常见错误:用 RewriteRule ^(.*) index.php?q=$1 导致 index.php 自身又被匹配,参数变成 q=index.php。解决方法是加条件限制:
- RewriteCond %{REQUEST_FILENAME} !-f
- RewriteCond %{REQUEST_FILENAME} !-d
- RewriteRule ^([^.]*)$ index.php?q=$1 [QSA,L]
- 前两行确保只对不存在的真实文件或目录才触发重写,.js、.css、images/ 等静态资源不受影响









