©
This document usesPHP Chinese website manualRelease
所述ETag
HTTP 响应报头为资源的特定版本的标识符。它允许缓存更高效,并节省带宽,因为如果内容没有改变,Web 服务器不需要发送完整的响应。另一方面,如果内容发生了变化,etags 有助于防止资源的同时更新互相覆盖(“空中冲突”)。
如果给定 URL 处的资源发生更改,则Etag
必须生成新值。因此,Etags 与指纹相似,也可能用于某些服务器的跟踪目的。它们的比较可以快速确定资源的两个表示是否相同,但它们也可能被设置为无限期地由跟踪服务器持续存在。
Header type |
Response header |
---|---|
Forbidden header name |
no |
ETag: W/""ETag: " "
W/
可选'W/'
(区分大小写)表示使用弱验证程序。弱验证器很容易生成,但对于比较来说却不太有用。强大的验证器是进行比较的理想选择,但可能非常难以高效生成。
Etag
相同资源的两个表示的弱值可能在语义上是等价的,但不是字节一致的。“"675af34563dc-tr34"
)之间的 ASCII 字符串。
ETag
没有指定生成值的方法。通常,使用内容的散列,最后修改时间戳的散列或仅修订版本号。例如,MDN 使用 wiki 内容的十六进制数字的散列。
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"ETag: W/"0815"
借助标题ETag
和If-Match
头文件,您可以检测到空中编辑冲突。
例如,在编辑 MDN 时,当前的 wiki 内容被散列并放入Etag
响应中:
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
当保存对 wiki 页面的更改(发布数据)时,POST
请求将包含包含要检查新鲜度If-Match
的ETag
值的标题。
If-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
如果散列不匹配,则意味着文档已被编辑,并且412
Precondition Failed
引发错误。
ETag
标题的另一个典型用例是缓存未更改的资源。如果用户再次访问一个给定的 URL(它有一个ETag
集合),并且它已经过时了,那么这个 URL 太旧而不能被视为可用,客户端会将它的值发送到ETag
一个If-None-Match
标题字段中:
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
服务器比较客户端ETag
(与其If-None-Match
一起发送)ETag
与其当前版本的资源,并且如果两个值匹配(即资源没有改变),则服务器发回304
Not Modified
状态,没有任何正文,告诉客户端缓存版本的响应仍然很好用(新鲜)。
Specification |
Title |
---|---|
RFC 7232, section 2.3: ETag |
Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests |
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) |