Apache用ProxyPass实现二级域名转发,本质是通过VirtualHost按Host头区分子域并反向代理至后端服务,需启用mod_proxy等模块,配置ProxyPreserveHost、ProxyPass/ProxyPassReverse、WebSocket支持及X-Forwarded头透传,确保路径、协议、IP与重定向正确。

用 Apache 的 ProxyPass 实现二级域名转发,本质是把不同子域(如 admin.example.com、api.example.com)分别代理到后端不同服务或路径,同时确保资源加载、重定向、WebSocket、客户端 IP 等关键环节不出错。核心不在“转发本身”,而在路径语义、协议兼容与请求上下文的完整透传。
按域名区分虚拟主机,各自配置独立 ProxyPass
Apache 通过 <VirtualHost> 块识别请求的 Host 头,这是二级域名转发的基础。每个子域应有专属配置,避免规则混用:
- 启用必要模块:
mod_proxy、mod_proxy_http(HTTP)、mod_proxy_wstunnel(WebSocket) - 每个
<VirtualHost *:80>或<VirtualHost *:443>内明确指定ServerName,如ServerName admin.example.com - 使用
ProxyPreserveHost On,让后端收到的Host头仍是原始子域名,便于后端日志、鉴权或生成绝对链接 - 禁用正向代理:
ProxyRequests Off,仅启用反向代理功能
路径前缀与后端服务对齐,斜杠必须一致
当子域名需映射到后端的子路径(例如 admin.example.com/ → http://127.0.0.1:3001/admin/),ProxyPass 的路径拼接逻辑极易出错。关键在末尾斜杠:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 错误写法:
ProxyPass /admin/ http://127.0.0.1:3001(缺末尾斜杠)→ 请求/admin/js/app.js变成http://127.0.0.1:3001/admin/js/app.js,后端找不到 - 正确写法:
ProxyPass /admin/ http://127.0.0.1:3001/admin/或更常见的是后端直接部署在根路径:ProxyPass / http://127.0.0.1:3001/(注意两个/都存在) - 务必同步配置
ProxyPassReverse / http://127.0.0.1:3001/,否则后端返回 302 重定向时,Location 头仍含内部地址
处理 WebSocket、真实 IP 和 HTTPS 协议透传
现代前端应用常依赖 WebSocket 和可信客户端信息,这些默认不被 ProxyPass 自动携带:
-
WebSocket:必须显式支持升级头。在对应
<VirtualHost>中添加:ProxyPass /ws/ ws://127.0.0.1:9000/ws/ProxyPassReverse /ws/ ws://127.0.0.1:9000/ws/
并确保Upgrade和Connection头未被过滤(一般默认保留,但可加RequestHeader set Connection "upgrade"显式声明) -
真实客户端 IP:后端看到的是 Apache 本机 IP。需配合
mod_headers添加头:RequestHeader set X-Real-IP %{REMOTE_ADDR}sRequestHeader set X-Forwarded-For %{REMOTE_ADDR}sRequestHeader set X-Forwarded-Proto "https"(HTTPS 场景下) -
HTTPS 透传:若前端走 HTTPS,但 Apache 到后端是 HTTP,后端需通过
X-Forwarded-Proto判断协议,避免生成http://链接导致混合内容警告
多子域共存时的顺序与冲突规避
若多个 <VirtualHost> 共享同一 IP 和端口,Apache 依据 ServerName 和 ServerAlias 匹配,不依赖配置顺序。但要注意:
- 通配符
ServerAlias *.example.com应放在最末,避免覆盖明确声明的子域(如www.example.com) - 不要在同一个
<VirtualHost>内混用多个ProxyPass指向不同后端——除非业务逻辑确需路径级分流(如/api/→ A,/assets/→ B),此时须严格按从长到短排序 - 静态资源(
.js、.css、/images/)可考虑用ProxyPass /static/ !排除代理,由 Apache 直接提供,提升性能

















