HEAD
请求是HTTP/1.1协议中定义的一个请求方法,与GET
请求相似,但只请求目标URL的头部,不请求实际的数据或者说正文内容。其主要用途是:
- 检查资源是否被修改
- 检查资源是否存在
- 校验缓存有效性
- 了解服务器性能
要用GET
请求模拟HEAD
请求,在实际操作上有些困难,因为GET
请求的定义就是要获取完整的资源内容。但有一些策略可以接近:
-
请求参数中加标志:当请求资源时,在查询参数中添加特定的标志,让服务器知道这是一个
HEAD
伪请求。然后服务器只返回相关头部信息并终止连接,不发送实际的数据。fetch("/resource?headOnly=true")
-
使用Range头:虽然这并不是一个真正的模拟,但你可以尝试通过设置
Range
头来只请求资源的第一个字节,这在某种程度上接近了HEAD
请求,但仍然会获得少量的数据。fetch("/resource", { headers: { "Range": "bytes=0-0" } });
-
取消请求:使用XMLHttpRequest或Fetch API开始一个
GET
请求,但在接收到响应头之后立即取消它,这样就不会接收到正文内容。这不是一个特别高效的方法,并且可能不适用于所有的情境。
无论采用哪种策略,关键都是服务器的配合。如果服务器不支持这种模拟行为,那么客户端做出的努力都是徒劳的。
最佳的解决方案仍然是使用真正的HEAD
请求,除非某些特殊情况或限制使得你不能这样做。
HEAD 请求返回的头部信息通常包括:
- 协议版本:HTTP/1.1
- 响应状态码:200 OK
- 响应头部:
- Server: web服务器名称
- Content-Type: 内容类型
- Content-Length: 内容长度
- Last-Modified: 最后修改时间
- ETag: 资源标签
- Accept-Ranges: 是否接受范围请求
- Cache-Control: 缓存指令
- Expires: 过期时间
以及其他一些描述该资源信息的响应头部。
但不会返回请求的正文 Body 部分。
使用 HEAD 请求可以在不传输全部响应内容的情况下,了解 target URL 的基本信息,常被用于:
- 检查资源是否被修改
- 检查资源是否存在
- 校验缓存有效性
- 了解服务器性能
总之,HEAD请求主要用来获取请求资源的头部元信息,而不用传输全部内容,可以用于资源探测和验证。