ETag - HTTP 编辑
ETag
HTTP响应头是资源的特定版本的标识符。这可以让缓存更高效,并节省带宽,因为如果内容没有改变,Web服务器不需要发送完整的响应。而如果内容发生了变化,使用ETag有助于防止资源的同时更新相互覆盖(“空中碰撞”)。
如果给定URL中的资源更改,则一定要生成新的Etag值。 因此Etags类似于指纹,也可能被某些服务器用于跟踪。 比较etags能快速确定此资源是否变化,但也可能被跟踪服务器永久存留。
Header type | Response header |
---|---|
Forbidden header name | no |
语法
ETag: W/"<etag_value>" ETag: "<etag_value>"
指令
W/
可选'W/'
(大小写敏感) 表示使用弱验证器。 弱验证器很容易生成,但不利于比较。 强验证器是比较的理想选择,但很难有效地生成。 相同资源的两个弱Etag
值可能语义等同,但不是每个字节都相同。- "<etag_value>"
- 实体标签唯一地表示所请求的资源。 它们是位于双引号之间的ASCII字符串(如“675af34563dc-tr34”)。 没有明确指定生成ETag值的方法。 通常,使用内容的散列,最后修改时间戳的哈希值,或简单地使用版本号。 例如,MDN使用wiki内容的十六进制数字的哈希值。
示例
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4" ETag: W/"0815"
避免“空中碰撞”
在ETag
和 If-Match
头部的帮助下,您可以检测到"空中碰撞"的编辑冲突。
例如,当编辑MDN时,当前的wiki内容被散列,并在响应中放入Etag
:
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4
将更改保存到Wiki页面(发布数据)时,POST
请求将包含有ETag值的If-Match
头来检查是否为最新版本。
If-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
如果哈希值不匹配,则意味着文档已经被编辑,抛出412
前提条件失败错误。
缓存未更改的资源
ETag
头的另一个典型用例是缓存未更改的资源。 如果用户再次访问给定的URL(设有ETag
字段),显示资源过期了且不可用,客户端就发送值为ETag
的If-None-Match
header字段:
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
服务器将客户端的ETag(作为If-None-Match字段的值一起发送)与其当前版本的资源的ETag进行比较,如果两个值匹配(即资源未更改),服务器将返回不带任何内容的304
未修改状态,告诉客户端缓存版本可用(新鲜)。
规范
Specification | Title |
---|---|
RFC 7232, section 2.3: ETag | 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.
相关内容
If-Match
If-None-Match
304
Not Modified
412
Precondition Failed
W3C Note: Editing the Web – Detecting the Lost Update Problem Using Unreserved Checkout
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论