Apache通过mod_proxy实现内网非对称网络代理需启用mod_proxy、mod_proxy_http、mod_proxy_ajp、mod_proxy_wstunnel、mod_headers、mod_proxy_html和mod_xml2enc模块,分层配置ProxyPass/ProxyPassReverse处理路径分流与重定向,用ProxyHTMLURLMap重写HTML链接,并禁用压缩、统一UTF-8编码、规避缓存干扰以防止内网地址泄露。

在Apache中用mod_proxy访问内网非对称网络,核心是让外部用户能安全、一致地访问不同协议、端口、路径甚至域名的后端服务,同时隐藏内网拓扑。这不是简单配一条ProxyPass就能解决的事——非对称意味着后端服务可能分布在不同主机、使用不同协议(HTTP/HTTPS/AJP)、监听不同端口、返回含内网地址的响应头或HTML内容,还可能启用压缩、非UTF-8编码或重定向跳转。
必须加载并启用的关键模块
缺一不可,顺序无关但必须全部启用:
- mod_proxy:代理基础框架
- mod_proxy_http:处理HTTP/1.1后端(最常见)
- mod_proxy_ajp:对接Tomcat等AJP服务(如Confluence/Synchrony)
- mod_proxy_wstunnel:支持WebSocket(协同编辑、实时通知必需)
- mod_headers:修改请求/响应头(禁用压缩、设置Host等)
- mod_proxy_html + mod_xml2enc:重写HTML内链接(修复内网href/src,依赖xml2enc解码)
分层配置后端服务路径与协议
非对称环境常有多个后端,需按路径精确分流,避免冲突:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 用ProxyPass和ProxyPassReverse分别定义每个服务的入口路径与目标地址
- 例如:内网有http://app1:8080/、https://app2:8443/api、ajp://tomcat:8009/confluence,对外统一映射为/app1/、/api/、/confluence/
- 注意末尾斜杠一致性:ProxyPass /app1/ http://app1:8080/(源路径和目标路径都带斜杠)
- 若某后端强制重定向(如302跳转),必须配对应ProxyPassReverse,否则Location头仍指向内网地址
处理内网地址泄露的三类典型场景
非对称网络中,后端常“不知自己被代理”,导致URL泄露:
- 响应头中的Location、Set-Cookie Domain:靠ProxyPassReverse自动修正,无需手动替换
- HTML页面内的链接(<a>、<img>、<script>):必须启用mod_proxy_html,并按顺序配置ProxyHTMLURLMap——先绝对URL(ProxyHTMLURLMap http://10.5.10.200 /app1),再相对路径(ProxyHTMLURLMap / /app1/)
- JavaScript动态拼接的URL或API Base URL:无法靠mod_proxy_html自动处理,需在前端代码中读取window.location.origin或通过HTTP头(如X-Forwarded-Proto)注入正确前缀
绕过压缩、编码与缓存干扰
非对称后端常默认启用gzip或返回gb2312编码,导致mod_proxy_html静默失效:
- 在
或 中加RequestHeader unset Accept-Encoding,防止后端返回gzip响应 - 确认后端返回Content-Type: text/html; charset=utf-8;若为gb2312等,必须启用mod_xml2enc并确保其生效
- 若启用了mod_cache,加CacheIgnoreHeaders Set-Cookie和CacheIgnoreCacheControl On,避免缓存未重写的原始HTML
- 大页面含长内联脚本时,调大ProxyHTMLBufSize 16384,防截断

















