MDN’s new design is in Beta! A sneak peek: https://blog.mozilla.org/opendesign/mdns-new-design-beta/

此页面上有脚本错误。虽然它是写给网站编辑,您可以在下面查看部分内容。

翻译正在进行中。

{{HTTPSidebar}}
 

ETag HTTP响应头是资源的特定版本的标识符。这可以让缓存更高效,并节省带宽,因为如果内容没有改变,Web服务器不需要发送完整的响应。而如果内容发生了变化,使用ETag有助于防止资源的同时更新相互覆盖(“空中碰撞”)。

如果给定URL中的资源更改,则一定要生成新的Etag值。 因此etags类似于指纹,也可能被某些服务器用于跟踪。 比较etags能快速确定此资源是否变化,但也可能被跟踪服务器永久存留。

Header type {{Glossary("Response header")}}
{{Glossary("Forbidden header name")}} no

语法

ETag: W/"<etag_value>"
ETag: "<etag_value>"

指令

W/ {{optional_inline}}
'W/'(区分大小写)表示使用弱验证器。 弱验证器很容易生成,但不利于比较。 强验证器是比较的理想选择,但很难有效地生成。 相同资源的两个弱Etag值可能语义等同,但不是每个字节都相同。
"<etag_value>"
实体标签唯一地表示所请求的资源。 它们是位于双引号之间的ASCII字符串(如“675af34563dc-tr34”)。 没有明确指定生成ETag值的方法。 通常,使用内容的散列,最后修改时间戳的哈希值,或简单地使用版本号。 例如,MDN使用wiki内容的十六进制数字的哈希值。

示例

ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
ETag: W/"0815"

Avoiding mid-air collisions

在ETag和{{HTTPHeader(“If-Match”)}}标题的帮助下,您可以检测致命编辑冲突。

例如,当编辑MDN时,当前的wiki内容被散列,并在响应中放入Etag:

ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4

将更改保存到Wiki页面(发布数据)时,{{HTTPMethod(“POST”)}}请求将包含有ETag值的{{HTTPHeader(“If-Match”)}}头来检查新鲜度。

If-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"

如果哈希值不匹配,则意味着文档已经被编辑,抛出{{HTTPStatus(“412”)}}前提条件失败错误。

Caching of unchanged resources

ETag头的另一个典型用例是缓存未更改的资源。 如果用户再次访问给定的URL(设有ETag字段),显示资源过期了且不可用,客户端就发送值为ETag的{{HTTPHeader(“If-None -Match“)}} header字段:

If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"

服务器将客户端的ETag(作为If-None-Match字段的值一起发送)与其当前版本的资源的ETag进行比较,如果两个值匹配(即资源未更改),服务器将返回不带任何内容的{{HTTPStatus “304”)}}未修改状态,告诉客户端缓存版本可用(新鲜)。

规范

Specification Title
{{RFC("7232", "ETag", "2.3")}} Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests

浏览器兼容性

{{Compat("http/headers/etag")}}

相关内容

文档标签和贡献者

 此页面的贡献者: WayneCui, luckymore
 最后编辑者: WayneCui,