proxypass 本身不重写路径,仅转发请求;实现“去掉前缀”需源路径与目标路径均以斜杠结尾,apache 才自动剥离匹配前缀;否则会原样拼接导致路径错误。
apache 的 proxypass 本身不重写路径,也不直接控制重定向逻辑;它只做请求转发。所谓“路径重写”和“重定向处理”,其实是通过 proxypass 配合 proxypassreverse、rewriterule+[p] 或 proxypassmatch 共同实现的,关键在路径匹配方式、斜杠一致性与响应头修正。
用 ProxyPass 实现前缀剥离(最常用)
这是去掉无用前缀(如把 /api/xxx 映射为后端的 /xxx)的标准做法,依赖 Apache 自动剥离前缀的机制:
- 源路径和目标 URL 都必须以斜杠结尾,且语义对齐:例如
ProxyPass /api/ http://backend:8080/ - 如果写成
ProxyPass /api/ http://backend:8080(缺末尾/),Apache 会把完整原始路径拼上去,导致后端收到/api/xxx而不是/xxx - 必须配对
ProxyPassReverse /api/ http://backend:8080/,否则后端返回的 302 跳转或 Cookie Path 仍含内网地址
用 ProxyPassMatch 或 RewriteRule+[P] 做动态路径改写
当需要正则提取、参数重组或条件代理时,ProxyPass 不够用,得换更灵活的方式:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
-
ProxyPassMatch "^/v1/(.*)$" "http://svc/v2/$1":把/v1/users映射为/v2/users -
RewriteRule "^/admin/(.*)$" "http://admin-svc/$1" [P,L]:配合RewriteEngine On,适合加 Header 判断、鉴权等前置逻辑 - 注意:
[P]表示交由 mod_proxy 处理,等效于内部代理;[L]防止后续规则干扰
让重定向真正对外可用(绕过内网地址)
后端返回的 302 Location 头若含 http://127.0.0.1:8080/login,浏览器会直连失败。仅靠 ProxyPassReverse 不够:
-
ProxyPassReverse只替换响应头中与配置完全一致的 URL 前缀(协议+主机+端口+路径),不改协议 - 必须向后端透传协议信息:
RequestHeader set X-Forwarded-Proto "https",并确保后端信任该头、生成 https:// 开头的跳转 - 加上
ProxyPreserveHost On,让后端看到原始 Host,避免它用本地地址构造链接 - 若后端无法修改,可临时用
mod_substitute替换响应头中的 http→https,但不推荐长期使用
路径顺序与排除规则不能错
Apache 按配置从上到下匹配,一旦命中就停止。顺序错误会导致规则失效:
- 先写具体路径:
ProxyPass /api/v2/ http://v2-svc/ - 再写宽泛兜底:
ProxyPass /api/ http://v1-svc/,最后是ProxyPass / http://web-app/ - 静态资源或错误页路径需显式排除:
ProxyPass /static/ !和ProxyPass /errors/ !,防止被代理走 - 建议用
<location></location>包裹相关指令,结构清晰、便于维护










