HEAD 方法请求服务器对 GET 会返回的响应,但不会传输响应内容。它适合需要状态、验证器、类型或长度的检查,但前提是元数据与真实的 GET 路径保持一致。

比较规范化后的响应头集合

Date 这类动态响应头会随请求不同而变化。只比较描述所选表示的那些字段:

url=https://www.example.test/downloads/manual.pdf

curl -sS -I "$url" > head.headers
curl -sS -D get.headers -o /dev/null "$url"

for file in head.headers get.headers; do
  printf '== %s\n' "$file"
  awk '
    /^HTTP\// ||
    tolower($1) ~ /^(content-type:|content-length:|content-encoding:|cache-control:|etag:|last-modified:|vary:)$/ { print }
  ' "$file"
done

两次请求应选择相同的状态码与表示元数据。压缩协商也应纳入比较:给两个请求发送相同的 Accept-Encoding 值。

不要把 HEAD 当作唯一的发布检查

服务器可能在文件缺失、不可读或被截断时仍合成看似合理的响应头。在冒烟测试里保留一个小的 GET 并核验其正文或校验和。HEAD 降低了传输成本,但并不能证明有效载荷存在。

显式检查重定向

不使用 --location 时,curl -I 报告第一个响应,适合测试重定向策略;使用 --location 时报告最终链,适合测试目标地址。请记录这条命令回答的是哪个问题:

curl -sS -I --max-redirs 0 https://old.example.test/manual
curl -sS -I --location https://old.example.test/manual

把方法相关的失败视为配置缺陷

一个对 GET 返回 200、对 HEAD 返回 405404 的静态页面,通常暴露出代理或路由的不一致。应当修复方法处理,而不是教监控系统忽略它——除非端点契约刻意不允许 HEAD

来源