浏览器如何存储 Etag 以及存储多长时间?

Posted

技术标签:

【中文标题】浏览器如何存储 Etag 以及存储多长时间?【英文标题】:How and for how long do browsers store Etags? 【发布时间】:2013-08-26 09:34:00 【问题描述】:

我希望实现基于cache-controlETag,我想知道ETags 在浏览器中存储多长时间,以及它们是否可以保存比当前会话更长的时间。

我有服务器设置并正确发送ETags 以获取响应,并且我正在使用jQuery.ajax 从浏览器发送请求。

系统正常工作,如果Not-Modified 标头(之前的ETag)与服务器上生成的ETag 匹配,则会以适当的304 响应进行响应。这一切都适用于当前会话,但是当我关闭浏览器并重新打开它时,jQuery 不再发送 Not-Modified 标头。

我想知道是否有任何方法可以用来触发默认浏览器行为,并发送Not-Modified 响应头(如果适用),无需手动设置 ajax 中的头在localStorage/indexedDb中请求或存储ETag

【问题讨论】:

如果在会话关闭后没有正确发送etag,可能是您没有发送正确的expires 标头。 关闭窗口时是否清除缓存? ETag 与文件一起存储在缓存中。因此,如果浏览器从缓存中清除元素,ETag 也会丢失。但是,如果文件仍在缓存中,则浏览器会发送 ETag 并请求告诉服务器缓存中已经存在带有该 ETag 的文件。 【参考方案1】:

一个Etag必须伴随着其他标签告诉浏览器多长时间保存内容

https://developers.google.com/speed/docs/best-practices/caching?csw=1#LeverageBrowserCaching

为所有可缓存资源指定 Expires 或 Cache-Control max-age 之一以及 Last-Modified 或 ETag 之一非常重要。同时指定 Expires 和 Cache-Control: max-age 或同时指定 Last-Modified 和 ETag 是多余的。

所以这完全取决于您使用 Expires 或 max-age 标签指定的持续时间以及浏览器将持有它的时间

etag 的唯一目的是让浏览器可以在初始过期期后发出“如果已修改”请求,以查看内容是否实际更改或返回未修改的 304。

管理不善的 304 可能会导致其他问题,例如不必要和冗余的 304 请求:http://calendar.perfplanet.com/2010/easy-cache-headers/

【讨论】:

感谢您提供的资源,方便验证我是否正确设置了标题。事实证明,我的问题是由于 Chrome 没有在 https 连接上缓存带有自签名证书的文件。

以上是关于浏览器如何存储 Etag 以及存储多长时间?的主要内容,如果未能解决你的问题,请参考以下文章

前端性能优化:配置ETag

浏览器缓存

浏览器缓存

http缓存js,css和图像

浏览器缓存之Expires Etag Last-Modified max-age详解

blob 在 Azure 存储帐户中保留多长时间?