我构建了一个服务工作人员,它始终使用缓存中的数据进行响应,然后在后台向服务器发送请求。如果服务器响应HTTP 304 - not modified
一切都很好,如果服务器响应HTTP 200
,这意味着数据已更改,新文件已放入缓存中,同时通知用户并要求刷新页面。
我用not-modified-since
/ last-modified
标头以确保客户端获得最新版本。当请求通过发送时fetch()
请求在到达网络的途中传递 HTTP 缓存 - 响应到达客户端时也会传递 HTTP 缓存。问题是当响应的状态为304
- 未修改 HTTP 缓存使用缓存版本响应服务工作线程并将状态替换为200
(正如在获取规范 - HTTP 网络或缓存获取)。在 Service Worker 中,无法查明是否200
响应最初由服务器发送(用户需要更新)或者由缓存发送并且服务器最初响应304
(最新版本已加载)。
有的是缓存模式标志可以设置为no-cache
,但是当请求发送到服务器时,这也会绕过 HTTP 缓存,这意味着if-modified-since
未设置标头,服务器没有机会找出客户端的版本。此外,此标志目前仅受 Firefox Nightly 支持。
我认为最好的解决方案是设置自定义 HTTP 标头,例如x-was-modified
当服务器响应时200
。这个自定义标头可以在 Service Worker 中访问,并可用于查明资源是否已更新 - 即使 HTTP 缓存替换了304
状态与200
.
- 这是合法的解决方案/解决方法吗?有没有建议的方法来解决这个问题?
- 在实现 Service Worker 缓存时,我是否应该依赖用于处理 HTTP 缓存的 HTTP 标头?或者我应该使用自定义
x-if-modified-since
/ x-last-modified
headers 并使用 indexedDB 将信息存储在客户端并将其附加到每个请求中?
- 为什么
fetch()
甚至更换304
代码与200
缓存中是否有最新版本?
您不能依靠状态代码(304 与 200)来确定某些内容是否已更改。如果代码的其他部分请求相同的资源,从而更新浏览器的缓存怎么办?
相反,只需比较响应Last-Modified
您发送的内容的标题If-Modified-Since
,或者您上次看到的任何内容Last-Modified
。如果值不匹配,则说明某些内容发生了变化。
为了获得更高的精度(如果数据可以在 1 秒内更改多次),请考虑使用ETag代替Last-Modified
.
为什么fetch()
甚至更换304
代码与200
缓存中是否有最新版本?
因为通常人们只是想获得新鲜的内容,无论它来自哪里。 304 响应仅对那些实现自己的 HTTP 缓存的人感兴趣。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)