Sve*_*ath 6 caching http http-caching http-status-code-304 service-worker
我构建了一个服务工作者,它总是用来自缓存的数据进行响应,然后在后台向服务器发送请求。如果服务器响应HTTP 304 - not modified一切正常,如果服务器响应HTTP 200,则意味着数据已更改并将新文件放入缓存中,同时通知用户并要求刷新页面。
我使用not-modified-since/last-modified标头来确保客户端获得最新版本。当通过请求发送fetch()请求时,它会在其通往网络的路上传递 HTTP 缓存 - 响应到达客户端时也会传递 HTTP 缓存。问题是当响应具有状态时304- 未修改 HTTP 缓存使用缓存版本响应服务工作者并将状态替换为200(如获取规范中所述 - HTTP-network-or-cache-fetch)。在 Service Worker 中,无法确定200响应最初是由服务器发送的(用户需要更新)还是由缓存发送并且服务器最初响应为304 (已经加载了最新版本)。
有可以设置为的缓存模式标志no-cache,但是当请求发送到服务器时,这也会绕过 HTTP 缓存,这意味着if-modified-since未设置标头并且服务器没有机会找出哪个版本客户有。此外,此标志目前仅由 Firefox 每晚支持。
我认为最好的解决方案是设置一个自定义的 HTTP 标头,就像x-was-modified服务器以200. 可以在 service worker 中访问此自定义标头,并可用于确定资源是否已更新 - 即使 HTTP 缓存将304状态替换为200.
x-if-modified-since/x-last-modified标头并使用 indexedDB 将信息存储在客户端上并将其附加到每个请求?fetch()还要替换304代码200?您不能依靠状态代码(304 与 200)来确定某些内容是否已更改。如果代码的其他部分请求相同的资源,从而更新浏览器的缓存怎么办?
相反,只需将响应的Last-Modified标头与您发送的内容If-Modified-Since或您上次在 中看到的内容进行比较Last-Modified。如果值不匹配,则某些内容已更改。
为了获得更高的精度(如果数据可以在 1 秒内更改多次),请考虑使用ETag代替Last-Modified。
如果缓存中有最新版本,为什么
fetch()还要替换304代码200?
因为通常人们只想获得新鲜的内容,而不管它来自哪里。304 响应只对那些实现自己的 HTTP 缓存的人感兴趣。
| 归档时间: |
|
| 查看次数: |
4460 次 |
| 最近记录: |