ProxyPass写对的关键是路径匹配精准、斜杠对齐、顺序合理:路径前缀与后端地址末尾斜杠必须一致以正确剥离前缀,多条规则须从具体到宽泛排列避免被兜底规则拦截,且必须配套ProxyPassReverse(路径前缀严格一致)、ProxyPreserveHost及启用必要模块如mod_proxy.so。

ProxyPass 写对的关键是路径匹配精准、斜杠对齐、顺序合理,不是简单填个地址就能用。
路径前缀和后端地址必须斜杠一致
Apache 会根据斜杠存在与否决定是否剥离前缀:
- 写成 ProxyPass /app/ http://backend:8080/ → 请求
/app/static/logo.png转发为http://backend:8080/static/logo.png - 写成 ProxyPass /app/ http://backend:8080/api/ → 同样请求转发为
http://backend:8080/api/static/logo.png - 错写成 ProxyPass /app/ http://backend:8080(缺末尾斜杠)→ 变成
http://backend:8080/app/static/logo.png,多了一层路径,大概率 404
多个规则必须从具体到宽泛排列
Apache 自上而下匹配,命中即停,顺序错了就失效:
- ✅ 正确:先写细粒度路径,再写兜底
- ProxyPass /admin/api/ http://admin:8080/
- ProxyPass /user/ http://user:9000/
- ProxyPass /assets/ http://cdn:8081/
- ProxyPass / http://app:3000/
- ❌ 错误:兜底写最前,后面全被忽略
- ProxyPass / http://app:3000/
- ProxyPass /api/ http://api:8000/ → 永远不生效
必须配套 ProxyPassReverse 和 ProxyPreserveHost
只写 ProxyPass 是半截配置,后端响应可能出错:
- ProxyPassReverse 要和 ProxyPass 的路径前缀完全一致(含斜杠),用于修正 Location、Set-Cookie 等响应头
-
ProxyPreserveHost On 必须放在同一
<virtualhost></virtualhost>或<location></location>块内,否则后端拿到的是127.0.0.1:8080而不是真实域名 - 建议用
<location></location>包裹,把 ProxyPass、ProxyPassReverse、ProxyPreserveHost 放在一起,逻辑清晰不易漏
别忘了启用必要模块
Apache 默认不加载代理模块,配置再对也会 503:
- 确保
mod_proxy.so、mod_proxy_http.so已启用(取消 httpd.conf 中对应行的注释) - 如果后端是 HTTPS,还需
mod_proxy_connect.so和SSLProxyEngine on - 要用 WebSocket(如
/ws/),必须启用mod_proxy_wstunnel.so,并用ws://协议写 ProxyPass


















