浏览器如何存储 Etag 以及存储多长时间?
Posted
技术标签:
【中文标题】浏览器如何存储 Etag 以及存储多长时间?【英文标题】:How and for how long do browsers store Etags? 【发布时间】:2013-08-26 09:34:00 【问题描述】:我希望实现基于cache-control
的ETag
,我想知道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 以及存储多长时间?的主要内容,如果未能解决你的问题,请参考以下文章