有了缓存头,我可以让客户端在一段时间内不在线检查更新,和/或每次都检查etag。我不知道的是我是否能做到这两个:首先使用离线版本,但同时在后台,检查更新。如果有新版本,则下次打开页面时将使用该版本。
对于一个完全静态的页面,除了用户自己更改它之外,这将比每次阻止检查etag更有效。
我想到的一个解决方法是使用javascript:设置头来无限期地缓存页面,并让一些javascript使用if-modified-since或其他东西发出请求,然后可以动态地更改页面。最大的问题是它不能使现有的缓存失效,所以它必须在理论上永远动态地更新页面。我也希望保持它的纯http(或者html,如果有一些标签可以做到这一点的话),但是我在网上找不到任何相关的点击。
一个相关的问题提到了“缓存的两个规则”:永远不要缓存html,永远缓存其他的东西。为了清楚起见,我的意思是缓存HTML。我所构建的东西的全部目的是让它在非常慢的连接(高延迟、低吞吐量,比如edge)上非常快。每节省一次往返行程,装载时间就缩短一两秒钟。
更新:读取更多的缓存资源,似乎Vary: Cookie
头可以在我的情况下起到作用。我想知道是否有一个更普遍的解决方案,但我还没有真正深入到不同的标题,所以我还不知道这是否有效。
最佳答案
解决方案1(http)
有一个缓存控制扩展stale-while-revalidate可以准确描述您想要的内容。
当出现在http响应中时,在重新验证缓存时失效-
控件扩展指示缓存可以在
在过期后出现,直到显示的数字
秒。
如果缓存的响应由于以下原因而过时
扩展名,缓存应尝试在仍然
提供陈旧的响应(即,无阻塞)。
cache-control: max-age=60,stale-while-revalidate=86400
当浏览器第一次请求页面时,它将缓存结果60秒,在这60秒期间,请求从缓存中得到响应,而不与源服务器联系。在接下来的86400s中,内容将同时从缓存和源服务器获取。仅当两个时段60s+86400s都已过期时,缓存将不提供缓存内容,而是等待源服务器刷新数据。
这种解决方案只有一个缺点。我找不到任何当前支持此缓存控制扩展的浏览器或中间缓存。
解决方案2(javascript)
另一个解决方案是使用Service workers及其特性对请求进行自定义响应。结合Cache API就足以提供所需的功能。
问题是,这个解决方案只适用于浏览器(不是中间缓存或其他http服务),甚至不是所有的浏览器都支持服务工作者和缓存api。