ETag 标头是如何工作的?

ETag(实体标签)响应头提供了缓存未更改资源的机制。它的值是表示资源的特定版本的标识符,下面是 ETag 标头的一个例子:

1
ETag: "version1"

请注意,ETag的值必须是带引号的字符串。

如何工作的?

下面是一般的高级步骤,其中响应头“ETag”以及请求头“If-None-Match”用于在客户端浏览器中缓存资源副本:

  1. 服务器接收特定资源的正常HTTP请求,例如XYZ。

  2. 服务器端准备响应。服务器端逻辑希望浏览器在本地缓存XYZ。默认情况下,所有浏览器始终缓存资源,因此不需要响应中的特殊标头。

  3. 服务器包含响应标头’ETag’,其值为:

    1
    ETag: "version1"
  4. 服务器使用上面的响应头’ETag’,和正文中的XYZ内容以及状态代码200向客户端发送响应。浏览器呈现资源,同时缓存资源副本以及标头信息。

  5. 稍后,同一浏览器再次请求相同的资源XYZ。使用以下条件请求标头:

    1
    If-None-Match: "version1"
  6. 收到XYZ请求以及“If-None-Match”请求头,服务器端逻辑通过比较服务器端ETag标识符的当前值和请求头中接收的值来检查XYZ是否需要资源的新副本。

    • 如果请求的If-None-Match与服务器上当前生成的ETag值相同,则返回具有空主体和状态代码304(未修改),并且浏览器使用XYZ的缓存副本。
    • 如果请求的If-None-Match值与XYZ的当前生成的ETag值(例如“version2”)不匹配,则服务器将身份中的新内容与状态代码200一起发回。响应中包含新的“ETag”标头。浏览器使用新的XYZ并使用新数据更新其缓存。

生成 ETag 值

ETag规范没有规定如何生成ETag值。这完全取决于应用程序生成它想要的东西。它可以手动创建和更新,也可以自动生成。其自动生成的常用方法包括使用资源内容的散列或仅使用最后修改时间戳的散列。生成的哈希应该是无冲突的。Hash-Collision是哈希函数的两个或多个输入给出相同输出的情况。

ETag 值验证

验证ETag值只不过是比较两个值(在请求头’If-None-match’中接收的值和当前表示资源的值)。有两种验证方法。

弱验证:两个资源表示在语义上是等价的,例如从业务逻辑的角度来看,一些内容差异并不重要,例如:页面上显示的当前日期对于更新整个资源可能并不重要。

弱验证的语法:

1
ETag: W/"<etag_value>"

请注意,此指令完全用于服务器端逻辑,并且对客户端浏览器不重要。

强验证:两个资源表示是逐字节相同的。这是默认值,并且没有使用特殊指令。

0%