ProxyPass 仅支持静态前缀映射,不参与条件判断;复杂代理路由须用 RewriteRule + [P] 实现,通过 RewriteCond 判断 Host、Header 等条件后转发,并需 ProxyPassReverse 修正响应头。

ProxyPass 和 RewriteRule 可以协同工作,但必须注意执行顺序和作用范围:RewriteRule 在请求处理早期运行(可改写 URL),而 ProxyPass 是简单、直接的路径映射,不参与重写逻辑。真正实现“复杂代理路由”的核心是 RewriteRule 配合 [P] 标志,而非依赖 ProxyPass 本身做条件判断。
先明确两者的分工
• ProxyPass / ProxyPassReverse 适合静态、固定路径的反向代理,比如 ProxyPass /api http://backend:8080/,它不解析条件、不支持正则匹配,也不受 RewriteEngine 控制。
• RewriteRule + [P] 才是动态路由的关键:通过 RewriteCond 判断 Host、URL、Header、环境变量等,再用 RewriteRule 匹配并用 [P] 标志触发 mod_proxy 转发,等效于带条件的 ProxyPass。
典型组合写法(推荐)
在虚拟主机或目录上下文中启用重写,并用 [P] 实现代理:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 确保已加载
mod_rewrite和mod_proxy(含mod_proxy_http) - 开启重写引擎:
RewriteEngine On - 用 RewriteCond 设置条件,例如按域名或路径前缀区分流量:
RewriteCond %{HTTP_HOST} ^api\.example\.com$ [NC]RewriteCond %{REQUEST_URI} ^/v2/.* - 用 RewriteRule 匹配并转发,[P] 表示代理,[L] 终止后续规则:
RewriteRule ^/(.*)$ http://v2-backend:9000/$1 [P,L] - 若需修改响应头中的 Location 或 Set-Cookie,必须搭配
ProxyPassReverse(即使没用 ProxyPass):ProxyPassReverse / http://v2-backend:9000/
常见陷阱与绕过方案
• ProxyPass 和 RewriteRule 混用易冲突:如果同时配置了 ProxyPass /app http://old/ 和一条重写规则匹配 /app/.*,Apache 会优先执行 ProxyPass(因它在早期阶段注册),导致 RewriteRule 不生效。
• 解决办法:统一用 RewriteRule + [P] 替代所有 ProxyPass,保持逻辑集中可控。
• 若需保留原始 Host 头给后端,加 ProxyPreserveHost On;若后端依赖路径前缀,可用 [PT] 或重写时手动补前缀,如:RewriteRule ^/legacy/(.*)$ http://legacy/$1 [P,L]。
进阶:根据请求头或参数分流
可以结合环境变量做更灵活路由:
- 按请求头选择后端:
RewriteCond %{HTTP_X_VERSION} ^v3$<br>RewriteRule ^/(.*)$ http://v3-svc/$1 [P,L] - 按查询参数跳转:
RewriteCond %{QUERY_STRING} version=beta<br>RewriteRule ^/service/(.*)$ http://beta-svc/$1?%{QUERY_STRING} [P,L](注意 ?%{QUERY_STRING} 显式透传参数) - 失败自动降级(需配合 mod_proxy 的 retry 机制或外部健康检查)


















