If-None-Match - HTTP 编辑
If-None-Match
是一个条件式请求首部。对于 GETGET
和 HEAD
请求方法来说,当且仅当服务器上没有任何资源的 ETag
属性值与这个首部中列出的相匹配的时候,服务器端会才返回所请求的资源,响应码为 200
。对于其他方法来说,当且仅当最终确认没有已存在的资源的 ETag
属性值与这个首部中所列出的相匹配的时候,才会对请求进行相应的处理。
对于 GET
和 HEAD
方法来说,当验证失败的时候,服务器端必须返回响应码 304 (Not Modified,未改变)。对于能够引发服务器状态改变的方法,则返回 412 (Precondition Failed,前置条件失败)。需要注意的是,服务器端在生成状态码为 304 的响应的时候,必须同时生成以下会存在于对应的 200 响应中的首部:Cache-Control、Content-Location、Date、ETag、Expires 和 Vary 。
ETag
属性之间的比较采用的是弱比较算法,即两个文件除了每个比特都相同外,内容一致也可以认为是相同的。例如,如果两个页面仅仅在页脚的生成时间有所不同,就可以认为二者是相同的。
当与 If-Modified-Since
一同使用的时候,If-None-Match 优先级更高(假如服务器支持的话)。
以下是两个常见的应用场景:
- 采用
GET
或HEAD
方法,来更新拥有特定的ETag
属性值的缓存。 - 采用其他方法,尤其是
PUT
,将If-None-Match
used 的值设置为 * ,用来生成事先并不知道是否存在的文件,可以确保先前并没有进行过类似的上传操作,防止之前操作数据的丢失。这个问题属于更新丢失问题的一种。
Header type | Request header |
---|---|
Forbidden header name | no |
语法
If-None-Match: <etag_value> If-None-Match: <etag_value>, <etag_value>, … If-None-Match: *
指令
- <etag_value>
- 唯一地表示所请求资源的实体标签。形式是采用双引号括起来的由 ASCII 字符串(如"675af34563dc-tr34"),有可能包含一个 W/ 前缀,来提示应该采用弱比较算法(这个是画蛇添足,因为 If-None-Match 用且仅用这一算法)。
*
- 星号是一个特殊值,可以代表任意资源。它只用在进行资源上传时,通常是采用
PUT
方法,来检测拥有相同识别ID的资源是否已经上传过了。
示例
If-None-Match: "bfc13a64729c4290ef5b2c2730249c88ca92d82d" If-None-Match: W/"67ab43", "54ed21", "7892dd" If-None-Match: *
规范
Specification | Title |
---|---|
RFC 7232, section 3.2: If-None-Match | Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests |
浏览器兼容性
BCD tables only load in the browser
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.
相关内容
ETag
If-Unmodified-Since
If-Modified-Since
If-Match
304
Not Modified
412
Precondition Failed
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论