ETag:
实体标签(ETag)是HTTP标头,用于Web缓存验证和从浏览器到资源的有条件请求。 ETag的值是代表资源特定版本的标识符。另外,ETag帮助防止资源的同时更新相互覆盖。 ETag标头的示例是
ETag: "version1"
注意: ETag标头的值必须用双引号引起来。
ETag的工作
- 服务器接收对特定资源的HTTP请求。
- 服务器生成响应并附加一个ETag头。例如: ETag:“ response_version1”。
- 服务器发送带有上述标头的状态码为200的响应。然后,应用程序代表资源,并同时将资源副本与标头信息一起缓存。
- 稍后,同一应用程序使用以下条件请求标头对同一资源进行另一个请求: If-None-Match:“ response_version1”
- 在接收到对资源的请求以及“ If-None-Match”标头后,服务器端逻辑将比较服务器端ETag标识符的当前值和在请求标头中接收到的ETag标识符。
- 如果请求的If-None-Match与服务器上当前生成的ETag值相同,则发送带有空主体的状态代码304(未修改) ,并且应用程序使用资源的缓存副本。
- 如果请求的If-None-Match值与同一资源的当前ETag的ETag值(例如“ response_version2”)不匹配,则服务器将正文中的新内容与状态码200发送回去。带有新值的’ETag’标头也包含在响应中。该应用程序使用新资源,并使用新数据更新其缓存。
生成ETag值
这完全取决于应用程序根据需要生成它。它可以手动创建和更新,也可以自动生成。自动生成资源的常用方法包括使用资源内容的哈希值或仅使用上次修改时间戳记的哈希值。生成的哈希应无冲突。
验证ETag值
它只是两个值的比较。分为两部分
- 强大的验证
- 弱验证
1,严格的验证
不同的资源表示形式是逐字节相同的。这是ETag的默认验证,并且不使用特殊指令。
2.弱验证:
这两种资源表示在语义上是等效的。例如,页面上显示的当前日期对于更新整个资源而言可能并不重要。
参考:
- https://zh.wikipedia.org/wiki/HTTP_ETag
- https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/ETag