rewritecond仅作条件判断,动态参数重写由rewriterule配合%{query_string}及qsa等标志实现;需用rewritecond捕获参数(如%1)、rewriterule引用并构造新路径,注意锚定正则、慎用[or]、调试用r=302。

Apache 的 RewriteCond 本身不直接处理“动态参数重写”,它只是做条件判断;真正执行参数改写的是 RewriteRule 配合 %{QUERY_STRING} 和 QSA、QSFL 等标志。关键在于:**用 RewriteCond 捕获查询参数,再在 RewriteRule 中引用捕获值,实现动态重写**。
用 RewriteCond 匹配并捕获查询参数
比如想把 /page.php?id=123&type=new 重写为 /article/123/new:
- 用
RewriteCond %{QUERY_STRING}匹配原始 URL 中的参数 - 用圆括号
()捕获需要的值(如(\d+)捕获数字 ID) - 捕获结果通过
%1、%2等在后续RewriteRule中引用
示例配置:
RewriteCond %{QUERY_STRING} ^id=(\d+)&type=([^&]+)$
RewriteRule ^page\.php$ /article/%1/%2? [R=301,L]
注意末尾的 ?:它会丢弃原始查询字符串,避免重定向后还带上 ?id=...。
保留部分参数 + 添加新参数
如果原 URL 是 /search?q=apple&page=2,想重写为 /search/apple?page=2&source=apache:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 先用
RewriteCond提取q值(%1),再用RewriteRule构造新路径 - 用
QSA(Query String Append)自动追加未匹配的参数(如page=2) - 额外参数(如
source=apache)需手动拼在RewriteRule的替换目标中
配置示例:
RewriteCond %{QUERY_STRING} ^q=([^&]+)
RewriteRule ^search$ /search/%1?source=apache [QSA,L]
访问 /search?q=apple&page=2 → 重写为 /search/apple?page=2&source=apache。
根据参数值做不同跳转(多条件分支)
比如 action=login 跳到 /auth/login,action=logout 跳到 /auth/logout:
- 每个
RewriteCond对应一种参数值,用[OR]连接多个条件(慎用,易出错) - 更清晰的做法是写多组独立规则,靠顺序和
L标志终止匹配 - 用
%{QUERY_STRING}精确匹配,避免子串误判(如action=loginform不应触发 login 规则)
推荐写法:
RewriteCond %{QUERY_STRING} ^action=login$
RewriteRule ^index\.php$ /auth/login? [R=302,L]
RewriteCond %{QUERY_STRING} ^action=logout$
RewriteRule ^index\.php$ /auth/logout? [R=302,L]
常见坑与注意事项
不要在 RewriteCond 中写完整 URL:它只匹配 %{QUERY_STRING}、%{REQUEST_URI} 等变量,不是整个请求行。
正则要锚定开头结尾:用 ^ 和 $ 防止部分匹配(如 id=12345 被 id=123 错误匹配)。
中文或特殊字符需编码处理:URL 参数默认是 percent-encoded,正则中应匹配编码后形式(如中文“测试”是 %E6%B5%8B%E8%AF%95),或改用 UNICODE 兼容模式(较复杂,一般建议前端规范编码)。
测试时关闭缓存:浏览器或代理可能缓存 301 重定向,调试阶段用 R=302 更安全。










