apache proxypass 本身不直接实现内网穿透,而是通过精准路径转发(斜杠严格匹配)、proxypassreverse修正响应头、proxypreservehost透传host、requestheader设置x-forwarded-for及x-forwarded-proto、单独配置proxy_wstunnel支持websocket等方式,将公网请求可靠落地至内网服务。
apache 的 proxypass 本身不直接“实现内网穿透”,而是作为反向代理的核心指令,把公网请求精准转发到内网服务地址——这才是内网穿透在应用层的落地方式。关键不在能不能转,而在于路径、头信息和协议是否透传正确。
路径映射必须斜杠严格一致
斜杠不是风格问题,是 Apache 路径重写的触发开关:
- 写成
ProxyPass /app/ http://192.168.10.5:8080/:请求/app/api/users会被剥离/app/,再拼上目标后缀,最终访问http://192.168.10.5:8080/api/users - 写成
ProxyPass /app/ http://192.168.10.5:8080(末尾缺/):同一请求会变成http://192.168.10.5:8080/app/api/users,大概率 404
必须搭配 ProxyPassReverse 修正响应头
后端返回 302 重定向或设置 Cookie 时,常带绝对路径(如 Location: /login)。若不配置 ProxyPassReverse,浏览器会跳转到内网地址:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 加一句
ProxyPassReverse /app/ http://192.168.10.5:8080/,Apache 就会自动把响应头里的/login改成/app/login - 多个后端可叠加配置,比如同时代理
/api/和/static/,每段都要配对
真实上下文不能丢:Host 和客户端 IP
内网服务若依赖原始域名或用户 IP(比如鉴权、日志、生成跳转链接),必须显式透传:
-
ProxyPreserveHost On:让后端收到的是Host: api.example.com,而不是内网 IP -
RequestHeader set X-Forwarded-For "%{REMOTE_ADDR}e":注入真实客户端 IP,后端需主动读取该头,而非用getRemoteAddr() - HTTPS 场景下补上:
RequestHeader set X-Forwarded-Proto "https" env=HTTPS
WebSocket 等特殊协议要单独处理
普通 ProxyPass 不处理 Upgrade: websocket 请求,会导致连接立即断开:
- 确保启用模块:
a2enmod proxy_wstunnel - 为 WebSocket 路径单独写一行:
ProxyPass "/ws/" "ws://10.0.20.8:9001/ws/"(注意协议前缀是ws://或wss://) - 不要和 HTTP 路径混用同一个
ProxyPass指令










