Host 是什么
Host 是请求必须携带的字段:它告诉服务器这次请求的是哪个域名,是虚拟主机路由与多租户隔离的基础。同一台服务器上跑多个站点时,全靠它来决定把请求交给哪个配置块;服务端生成绝对地址、做跳转与写链接时也依赖它。因为客户端可以任意填写这个字段,它也经常成为攻击入口——缓存投毒与链接劫持都从伪造它开始。
基本信息
| 名称 | Host(RFC 9110 §7.2) |
|---|---|
| 作用 | 虚拟主机路由、生成绝对地址的依据 |
| 必备性 | HTTP/1.1 请求缺失该字段时服务端应返回请求错误 |
| 新版协议 | 在后续版本中对应同名伪头部,承担相同职责 |
| 安全要求 | 不可无条件信任,需配合白名单校验 |
典型使用场景
- 多站点共存:一台服务器上按域名区分不同站点配置
- 反向代理转发:网关按域名把请求转到不同后端
- 多租户隔离:按域名判断租户归属并加载对应配置
- 生成绝对地址:服务端拼跳转地址与静态资源前缀时使用
- 本地调试:直连源站地址并手工指定域名,绕过边缘节点验证
多域名分流与本地调试
多域名分流与本地调试
curl -sv https://example.com/ 2>&1 | grep -i 'host:' # 看实际发出的字段值
curl -si http://1.2.3.4/ -H 'Host: www.example.com' # 直连源站地址,手工指定域名
nginx -T | grep -n 'server_name' # 查看站点按哪些域名匹配配置不当的后果
| 配置情况 | 后果 |
|---|---|
| 缺少默认配置块 | 未匹配的域名落到第一个配置块,可能暴露内部站点 |
| 未做白名单校验 | 伪造的域名可影响生成的跳转与链接地址 |
| 代理转发时改写字段 | 与后端虚拟主机不匹配,返回未找到或拒绝服务 |
| 域名解析与配置不一致 | 请求打到本机却没有对应配置块 |
安全加固要点
- 为默认配置块设置明确的拒绝行为,避免任何域名都能匹配到内容
- 把该字段拼接进跳转地址前先做白名单校验,不要直接使用客户端提供的值
- 内部系统不要暴露在公网,避免域名枚举与服务探测
该字段可以由客户端任意伪造:若网关只依据它做路由而缺少校验,可能被用来做缓存投毒或把密码重置链接指向攻击者域名,务必配置默认站点并维护域名白名单。
在新一代协议中它被拆分为同名伪头部,语义一致但不能像旧版本那样自由增删。用工具对比协议版本时,注意观察这一点,否则会误判请求头缺失。