apache基础反向代理关键在三件事:必须启用mod_proxy和mod_proxy_http模块,proxypass与proxypassreverse须成对且路径斜杠严格一致,通过proxypreservehost和x-forwarded-*头确保后端获取真实host与客户端ip。

Apache 配置基础反向代理,关键不是写多少行,而是三件事做对:模块启用正确、路径映射精准、响应头重写到位。
必须启用的两个核心模块
Apache 默认关闭所有代理功能,缺一不可:
- mod_proxy:代理引擎主模块,没有它 ProxyPass 指令会直接报错(500 或 Invalid command)
- mod_proxy_http:专用于 HTTP/HTTPS 后端通信,Node.js、Go、Java 等服务都靠它转发
检查是否已加载(Linux/macOS):
httpd -M | grep proxy
应看到 proxy_module (shared) 和 proxy_http_module (shared)。
若未出现,编辑 httpd.conf,取消以下两行注释:
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so
ProxyPass 和 ProxyPassReverse 必须成对出现
只配 ProxyPass 是常见错误——后端返回 302 跳转时,会暴露 http://127.0.0.1:8080/login 这类内网地址,用户点击即失败。
正确示例(代理 Java 应用):
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
<virtualhost> ServerName app.example.com ProxyPreserveHost On ProxyPass / http://127.0.0.1:8080/ ProxyPassReverse / http://127.0.0.1:8080/ </virtualhost>
- ProxyPreserveHost On:让原始 Host 头(如 app.example.com)透传给后端,避免生成错误的绝对 URL
-
前后斜杠严格一致:比如
ProxyPass /api/对应后端地址也必须是http://localhost:3000/api/,否则/api/user会被拼成/apiuser,触发 404
让后端拿到真实客户端 IP
Apache 单加 X-Forwarded-For 头还不够。Java 或 Spring Boot 默认不解析该头,request.getRemoteAddr() 永远是 127.0.0.1。
Apache 端需添加:
RequestHeader set X-Forwarded-For "%{REMOTE_ADDR}e" early
RequestHeader set X-Forwarded-Proto "http" env=!HTTPS
RequestHeader set X-Forwarded-Proto "https" env=HTTPS
后端也得配合:Spring Boot 推荐配置 server.forward-headers-strategy=framework;其他语言需显式读取 X-Forwarded-For 头。
验证与重启
保存配置后,执行:
- 语法检查:
httpd -t(无报错才继续) - 重启服务:
systemctl restart httpd(RHEL/CentOS)或sudo apachectl restart(macOS/Linux) - 访问
app.example.com,观察是否返回后端服务内容,同时检查响应头中Location和Set-Cookie是否已被正确重写










