Apache反向代理本质是透明转发请求并修正响应,关键在路径对齐、头透传和ProxyPassReverse;需启用mod_proxy与mod_proxy_http,禁用ProxyRequests,严格匹配顺序与斜杠一致性。
apache 通过 proxypass 实现反向代理,本质是把客户端对某个路径或域名的请求,透明转给后端服务(如 node.js、tomcat、go 等),再把响应原样返回。关键不在“转发”本身,而在于路径对齐、头信息透传和重定向修正——配置错一个斜杠或漏一行 proxypassreverse,就可能导致 404、跳转失败或 cookie 失效。
基础模块启用与安全前提
没启用模块,ProxyPass 指令直接被忽略或报 500 错误:
- 必须启用:
mod_proxy(代理引擎)和mod_proxy_http(支持 HTTP/HTTPS 后端) - 推荐启用:
mod_ssl(HTTPS 终结)、mod_proxy_wstunnel(WebSocket 支持) - 禁用正向代理:
ProxyRequests Off(生产环境强制要求) - 放行代理权限:
<proxy> Require all granted </proxy>
最简可用配置示例
假设后端服务运行在 http://127.0.0.1:3000/,你想让访问 https://example.com/ 的请求全部交给它处理:
<VirtualHost *:443>
ServerName example.com
SSLEngine on
# SSL 证书配置略
<pre class='brush:php;toolbar:false;'>ProxyPreserveHost On
ProxyPass / http://127.0.0.1:3000/
ProxyPassReverse / http://127.0.0.1:3000/
⚠️ 已弃用 — 该技能已拆分为两个独立技能,以提升模块化程度:**webchat-https-proxy**(HTTPS/WSS 反向代理)和 **webchat-voi...**
说明:
-
ProxyPreserveHost On:后端收到的Host头仍是example.com,不是127.0.0.1:3000 - 前后斜杠必须一致:
/对应http://.../;若写成ProxyPass / http://...:3000(缺末尾 /),会导致/static/app.js被错拼为http://...:3000static/app.js -
ProxyPassReverse不可省:后端返回 302 重定向时,Location响应头默认含内部地址,不修正则浏览器跳转失败
多路径或多子域的转发策略
一个站点常需将不同路径分发到不同后端,顺序和结构直接影响是否生效:
- 规则按配置**从上到下匹配,命中即停**,所以必须从具体到宽泛:
✅ 正确顺序:/api/v2/→/api/→/assets/→/
❌ 错误顺序:/写在最前,其余全失效 - 用
<location></location>包裹提升可读性,语义清晰且便于维护:<Location "/admin/"><br> ProxyPass http://admin-svc:9000/<br> ProxyPassReverse http://admin-svc:9000/<br> </Location> - 二级域名转发靠
<virtualhost></virtualhost>+ServerName区分,每个子域独立配一套ProxyPass
真实场景中容易踩的坑
很多问题表面是 404 或连接重置,根源在上下文未透传:
-
前端资源加载失败:后端 HTML 中写的是
src="/static/app.js",但实际该资源应在/app/static/下。解决方法是后端设publicPath: "/app/",同时 Apache 配置ProxyPass /app/ http://backend:8080/(注意斜杠对齐) -
WebSocket 连接被拒绝:需显式支持升级协议:
ProxyPass /ws/ ws://backend:9000/ws/<br> ProxyPassReverse /ws/ ws://backend:9000/ws/
并确保Upgrade和Connection请求头未被过滤 -
后端看到的 IP 总是 127.0.0.1:加两行透传真实客户端 IP:
RequestHeader set X-Real-IP "%{REMOTE_ADDR}s"<br> RequestHeader set X-Forwarded-For "%{REMOTE_ADDR}s" -
后端生成的链接变成 HTTP 或带错端口:补充协议和 Host 透传:
RequestHeader set X-Forwarded-Proto "https" env=HTTPS<br> ProxyPreserveHost On

















