RewriteRule 本身不参与负载均衡决策,但可通过[P]标志实现基于请求头、路径等的智能分流,配合mod_proxy_balancer完成路由判断与集群分发;必须显式添加[P]才触发反向代理,否则仅为URL重写。

必须加 [P] 标志才能触发代理
仅靠 RewriteRule 不会走代理;必须显式加上 [P](proxy)标志,Apache 才会把重写后的目标当作后端地址发起反向代理请求:
RewriteRule ^/api/(.*)$ http://backend-a:8000/api/$1 [P,L]RewriteRule ^/admin/(.*)$ balancer://admin-cluster/$1 [P,L]
漏掉 [P],结果只是 URL 重写(302 跳转或内部重定向),不是代理转发。
用 RewriteCond 匹配请求头做分流
比如按 X-Env 头区分测试/生产环境,或按 User-Agent 分流移动端:
RewriteCond %{HTTP:X-Env} ^prod$RewriteRule ^/service/(.*)$ balancer://prod-backend/$1 [P,L]RewriteCond %{HTTP:X-Env} ^test$RewriteRule ^/service/(.*)$ balancer://test-backend/$1 [P,L]
注意:RewriteCond 必须紧挨着对应的 RewriteRule,且每个条件单独一行;不要用 [OR] 拼复杂条件,容易逻辑错乱。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
匹配路径前缀并路由到不同 balancer 集群
常见场景:/v1/ → 旧版集群,/v2/ → 新版集群:
-
<Proxy balancer://legacy>BalancerMember http://192.168.1.10:8080 loadfactor=2</Proxy> -
<Proxy balancer://modern>BalancerMember http://192.168.1.20:8080 loadfactor=3</Proxy> RewriteRule ^/v1/(.*)$ balancer://legacy/v1/$1 [P,L]RewriteRule ^/v2/(.*)$ balancer://modern/v2/$1 [P,L]
这样既隔离了配置作用域,又避免了全局 ProxyPass 的硬编码耦合。
转发时注意 Host 和 Cookie 域名问题
默认情况下,Apache 会把原始 Host 头透传给后端。如果后端依赖特定域名(如生成绝对链接、校验 Referer),需手动控制:
- 关闭自动透传:
ProxyPreserveHost Off - 手动设置 Host:
RequestHeader set Host "backend-prod.example.com" - 修正 Set-Cookie 域名:
ProxyPassReverseCookieDomain backend-prod.example.com proxy.example.com
否则可能出现登录态丢失、跳转地址错误等问题。

















