请求首部 If-Match
的使用表示这是一个条件请求。在请求方法为 GET
和 HEAD
的情况下,服务器仅在请求的资源满足此首部列出的 ETag
之一时才会返回资源。而对于 PUT
或其他非安全方法来说,只有在满足条件的情况下才可以将资源上传。
The comparison with the stored ETag
之间的比较使用的是强比较算法,即只有在每一个比特都相同的情况下,才可以认为两个文件是相同的。在 ETag 前面添加 W/
前缀表示可以采用相对宽松的算法。
以下是两个常见的应用场景:
- For
GET
和HEAD
方法,搭配Range
首部使用,可以用来保证新请求的范围与之前请求的范围是对同一份资源的请求。如果 ETag 无法匹配,那么需要返回416
- 对于其他方法来说,尤其是
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 | Title |
---|---|
RFC 7232, section 3.1: If-Match | Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests |
浏览器兼容性
The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.
Feature | Chrome | Firefox | Edge | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
Basic Support | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) |
Feature | Android | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari |
---|---|---|---|---|---|---|---|
Basic Support | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) |
相关内容
ETag
If-Unmodified-Since
If-Modified-Since
If-None-Match
416
Range Not Satisfiable
412
Precondition Failed