©
本文档使用 PHP中文网手册 发布
所述ETag
HTTP 响应报头为资源的特定版本的标识符。它允许缓存更高效,并节省带宽,因为如果内容没有改变,Web 服务器不需要发送完整的响应。另一方面,如果内容发生了变化,etags 有助于防止资源的同时更新互相覆盖(“空中冲突”)。
如果给定 URL 处的资源发生更改,则Etag
必须生成新值。因此,Etags 与指纹相似,也可能用于某些服务器的跟踪目的。它们的比较可以快速确定资源的两个表示是否相同,但它们也可能被设置为无限期地由跟踪服务器持续存在。
Header type | Response header |
---|---|
Forbidden header name | no |
ETag: W/"<etag_value>"ETag: "<etag_value>"
W/
可选'W/'
(区分大小写)表示使用弱验证程序。弱验证器很容易生成,但对于比较来说却不太有用。强大的验证器是进行比较的理想选择,但可能非常难以高效生成。
Etag
相同资源的两个表示的弱值可能在语义上是等价的,但不是字节一致的。“<etag_value>”实体标记唯一地表示请求的资源。它们是放在双引号(像是"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) |