If-Match

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

请求首部 If-Match 的使用表示这是一个条件请求。在请求方法为 GETHEAD 的情况下,服务器仅在请求的资源满足此首部列出的 ETag值时才会返回资源。而对于 PUT 或其他非安全方法来说,只有在满足条件的情况下才可以将资源上传。

ETag 之间的比较使用的是强比较算法,即只有在每一个字节都相同的情况下,才可以认为两个文件是相同的。在 ETag 前面添加 W/ 前缀表示可以采用相对宽松的算法。

以下是两个常见的应用场景:

  • 对于 GETHEAD 方法,搭配 Range首部使用,可以用来保证新请求的范围与之前请求的范围是对同一份资源的请求。如果 ETag 无法匹配,那么需要返回 416 (Range Not Satisfiable,范围请求无法满足) 响应。
  • 对于其他方法来说,尤其是 PUT, If-Match 首部可以用来避免更新丢失问题。它可以用来检测用户想要上传的不会覆盖获取原始资源之后做出的更新。如果请求的条件不满足,那么需要返回 412 (Precondition Failed,先决条件失败) 响应。
Header type Request header
Forbidden header name no

语法

If-Match: <etag_value>
If-Match: <etag_value>, <etag_value>, …

指令

<etag_value>

唯一地表示一份资源的实体标签。标签是由 ASCII 字符组成的字符串,用双引号括起来(如 "675af34563dc-tr34")。前面可以加上 W/ 前缀表示应该采用弱比较算法。

*

星号是一个特殊值,可以指代任意资源。

示例

If-Match: "bfc13a64729c4290ef5b2c2730249c88ca92d82d"

If-Match: W/"67ab43", "54ed21", "7892dd"

If-Match: *

规范

Specification
HTTP Semantics
# field.if-match

浏览器兼容性

BCD tables only load in the browser

参见