我构建了一个服务工作者,它始终使用缓存中的数据进行响应,然后在后台向服务器发送请求。如果服务器响应Tableforbasictask's
一切正常,如果服务器以HTTP 304 - not modified
响应,则表示数据已更改,新文件被放入缓存,用户也会收到通知并要求提供页面刷新。
我使用HTTP 200
/ not-modified-since
标头来确保客户端获得最新版本。当通过last-modified
发送请求时,请求将HTTP缓存传递给网络 - 当响应到达客户端时,响应也会传递HTTP缓存。问题是当响应的状态为fetch()
时 - 未修改HTTP缓存会响应具有缓存版本的服务工作者,并将状态替换为304
(如{{3}中所述) })。在服务工作者中,无法确定200
响应最初是由服务器发送的(用户是否需要更新),还是由缓存发送,服务器最初是以{{1}响应的(已加载最新版本)。
fetch specification - HTTP-network-or-cache-fetch可以设置为200
,但是当请求发送到服务器时,这也会绕过HTTP缓存,这意味着304
标头是没有设置,服务器没有机会找出客户端的版本。此标志目前仅由firefox支持。
我认为最好的解决方案是在服务器以no-cache
响应时设置自定义HTTP标头,如if-modified-since
。可以在服务工作者中访问此自定义标头,并可用于查明资源是否已更新 - 即使HTTP缓存将x-was-modified
状态替换为200
。
304
/ 200
标头并使用indexedDB将信息存储在客户端上并将其附加到每个请求? x-if-modified-since
甚至会将x-last-modified
代码替换为fetch()
?答案 0 :(得分:2)
您不能依赖状态代码(304对200)来确定某些内容是否已更改。如果您的代码的其他部分请求相同的资源,从而更新浏览器的缓存怎么办?
相反,只需将回复的.setVisible
标题与您在Last-Modified
中发送的标题或If-Modified-Since
中最后看到的内容进行比较。如果值不匹配,则会发生变化。
为了获得更高的精度(如果数据可以在1秒内多次更改),请考虑使用ETag
代替Last-Modified
。
如果缓存中有最新版本,为什么
Last-Modified
甚至会将fetch()
代码替换为304
?
因为通常人们只想获得新鲜的内容,无论它来自哪里。 304响应仅对那些实现自己的HTTP缓存的人感兴趣。