HEAD 是什么
HEAD 的请求语义与读取方法完全相同,唯一的差别是服务端不得返回响应体,只返回状态行与头部。它因此成为探测资源元信息最省流量的手段:判断资源是否存在、查看体积与最后修改时间、确认缓存与跳转配置,都不需要传输内容。规范要求它的头部必须与对应读取方法的结果一致,否则依赖它的下载器、缓存与健康检查都会做出错误判断。
基本信息
| 名称 | HEAD,定义见方法与状态码相关章节 |
|---|---|
| 作用 | 探测资源存在性与元数据,不返回内容 |
| 特性 | 安全且幂等 |
| 与读取方法关系 | 请求语义相同,仅不返回响应体 |
| 规范要求 | 头部应与对应读取方法的结果保持一致 |
典型使用场景
- 健康检查:用极小的开销确认服务与资源是否可用
- 下载前探测:先拿到体积与最后修改时间再决定是否下载
- 缓存校验:确认资源是否变化以及缓存策略是否如预期
- 跳转检查:确认地址是否发生跳转以及目标地址
- 发布校验:上线后确认资源是否已更新、体积是否正确
探测文件元信息
探测文件元信息
curl -I https://www.example.com/big.iso # 只取头部,不下载内容
# 关注体积、最后修改时间与缓存指令
curl -sI https://www.example.com/ | head -5 # 快速看状态行与关键头部
curl -s -o /dev/null -w '%{http_code} %{size_download}\n' -I https://www.example.com/ # 脚本里确认下载体积为零使用时的注意点
| 注意点 | 说明 |
|---|---|
| 头部必须与读取方法一致 | 实现偷懒会让缓存与下载器判断错误 |
| 不能用于获取内容 | 它天生没有响应体,不要用它做内容探测 |
| 行为可能被中间层改变 | 不同边缘节点对它的处理策略可能不同 |
排查要点
- 探测结果与读取方法不一致时,优先怀疑中间层对两种方法的处理不同
- 用它的结果判断内容是否变化并不可靠,应该比对校验值
- 批量健康检查要注意某些服务对它返回拒绝,改用读取方法但只取头部
部分框架不支持该方法时,规范允许按读取方法处理并丢弃响应体。因此它在不同实现下可能产生一次完整的源站处理开销,用它做高频健康检查前应当先确认服务端的实际行为。
某些中间层对它的处理与读取方法不同:边缘节点可能直接返回缓存元信息,也可能转发到源站。排障时只依据它的结果,可能与用户实际请求的表现不一致。