apache中实现多域名共享同一后端系统,本质是通过virtualhost配置proxypass+proxypreservehost+proxypassreverse,透传原始host头并重写响应头,确保url表现一致、cookie正确、静态资源可访问。

Apache 中实现多域名共享同一后端系统,本质是让不同域名(如 siteA.com、siteB.net)的请求,按规则映射到后端服务的同一套路径逻辑(比如都转发给 http://127.0.0.1:8080/),同时保持 URL 表现一致、Cookie 正确、静态资源可访问。这不是靠 RewriteRule “改地址栏”就能完成的,关键在反向代理 + 主机头透传 + 路径适配。
用 ProxyPass 实现跨域名统一后端接入
多个域名要共用一个后端应用(如 Java Spring Boot 或 Node.js 服务),最直接的方式是为每个域名配置独立的 VirtualHost,并统一使用 ProxyPass 指向后端地址:
- 确保已启用
mod_proxy和mod_proxy_http - 每个
<virtualhost></virtualhost>块中,设置:
ProxyPreserveHost On —— 把原始 Host 头(如 siteA.com)传给后端,让后端能识别当前访问的是哪个站点
ProxyPass / http://127.0.0.1:8080/ —— 所有根路径请求代理过去
ProxyPassReverse / http://127.0.0.1:8080/ —— 重写后端返回的 Location 等响应头,避免跳转回内部地址 - 若后端需区分来源域名做定制逻辑(如读取 Host 判断租户),这个 Host 透传就是前提
路径前缀隔离(可选):同一后端支撑多租户子路径
如果不想完全裸露根路径,而是希望 siteA.com/app1/ 和 siteB.net/app2/ 都映射到后端的 /,但彼此隔离,可用带路径的 ProxyPass:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
ProxyPass /app1/ http://127.0.0.1:8080/ProxyPassReverse /app1/ http://127.0.0.1:8080/- 后端收到的请求路径会自动去掉
/app1前缀,例如GET /app1/api/user→ 后端实际处理/api/user - 注意:后端生成的绝对链接(如
<a href="/static/css/main.css"></a>)仍以根为基准,需配合<base href="/app1/">或后端动态注入 basePath
Cookie 与 Session 的跨域名一致性处理
多个域名共享后端意味着登录态要互通,否则用户在 siteA.com 登录后,访问 siteB.net 又要重新登录:
- 后端设 Cookie 时,Domain 必须设为公共父域,例如
Domain=.example.com(前提是所有域名都在xxx.example.com下) - 若域名完全无关(如 siteA.com 和 siteB.net),无法通过 Domain 共享 Cookie;此时应改用 Token + 后端统一鉴权中心(如 JWT 存 Redis),前端把 token 放请求头传递
- Apache 本身不管理 session,但可通过
RequestHeader set X-Forwarded-Host %{HTTP_HOST}e把原始域名传给后端,辅助租户识别
静态资源与 HTTPS 适配要点
前端 HTML 中的资源链接(CSS/JS/图片)若写死为绝对路径(如 https://siteA.com/js/app.js),换域名就会 404:
- 推荐全部使用相对路径(
./js/app.js)或协议相对路径(//siteA.com/js/app.js) - 若必须用绝对路径,可在 Apache 中用
Substitute模块动态替换响应体中的 URL(需启用mod_substitute和mod_filter) - HTTPS 场景下,务必在 VirtualHost 的 443 端口配置中添加
RequestHeader set X-Forwarded-Proto "https",避免后端误判为 HTTP 导致跳转循环或混合内容警告










