apache 的 servername 本身不获取真实源站域名,仅静态匹配请求 host 头;关键需 cdn 配置回源 host 为加速域名,并在 apache 启用 proxypreservehost on,使后端通过请求头 host 字段读取用户访问的 www.example.com。

在 CDN 加速环境下,Apache 的 ServerName 本身不会“获取”真实源站域名——它只是你配置中静态指定的值,用于匹配请求中的 Host 头。真正需要传递和识别的是用户最初访问的**加速域名**(比如 www.example.com),而不是源站内部地址(如 origin.example.com 或 IP)。关键在于:CDN 回源时是否把原始 Host 头正确透传过来,以及 Apache 是否保留并让后端应用能读取它。
确保原始 Host 头完整到达 Apache
CDN 默认回源时会用自己的 Host 头(如 origin.example.com)发起请求,这会导致 Apache 的 ServerName 或后端程序拿到的是源站域名,而非用户访问的加速域名。解决办法是:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 在 CDN 控制台配置「回源 HOST」为
跟随客户端 Host或手动填成www.example.com(即加速域名),不能写成源站别名或 IP - Apache 端启用
ProxyPreserveHost on(仅在反向代理场景下有效),这样即使 CDN 已正确带 Host,Apache 也不会覆盖它 - 确认 Apache 虚拟主机的
ServerName设为源站实际绑定的域名(如origin.example.com),它只起路由作用,不影响 Host 头内容
后端应用如何读取真实访问域名
应用不依赖 ServerName,而是读取 HTTP 请求头中的 Host 字段。只要上面两步配置正确,后端就能拿到 www.example.com:
- PHP 中用
$_SERVER['HTTP_HOST']或$_SERVER['SERVER_NAME'](后者受UseCanonicalName影响,不推荐) - Node.js(Express)中用
req.get('Host')或req.hostname - Java(Spring Boot)中用
request.getHeader("Host") - 可加调试接口验证:
curl -H "Host: www.example.com" https://your-origin-ip/debug,检查响应头是否一致
避免常见干扰项
有些做法看似相关,实则无效或冗余:
-
RequestHeader set Host ...会强行改写 Host 头,破坏原始信息,不要用 -
UseCanonicalName On会让 Apache 返回配置的ServerName而非请求头 Host,应设为Off - 如果用了 WAF 或多层代理,需同步检查
X-Forwarded-For和X-Real-IP配置,但 Host 头仍以 CDN 回源为准 - HTTPS 回源时,CDN 可能重写 Host;若源站只监听 HTTP,务必在 CDN 设置中开启「HTTP 回源」并确保回源 HOST 正确










