识别服务worker / fetch()中的HTTP 304

时间:2016-05-10 11:53:32

标签: http caching http-caching service-worker http-status-code-304

我构建了一个服务工作者,它始终使用缓存中的数据进行响应,然后在后台向服务器发送请求。如果服务器响应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

  • 这是一个合法的解决方案/解决方法吗?有没有建议的方法来解决这个问题?
  • 在实现服务工作缓存时,我是否应该依赖应该处理HTTP缓存的HTTP头?或者我应该使用自定义304 / 200标头并使用indexedDB将信息存储在客户端上并将其附加到每个请求?
  • 如果缓存中有最新版本,为什么x-if-modified-since甚至会将x-last-modified代码替换为fetch()

1 个答案:

答案 0 :(得分:2)

您不能依赖状态代码(304对200)来确定某些内容是否已更改。如果您的代码的其他部分请求相同的资源,从而更新浏览器的缓存怎么办?

相反,只需将回复的.setVisible标题与您在Last-Modified中发送的标题或If-Modified-Since中最后看到的内容进行比较。如果值不匹配,则会发生变化。

为了获得更高的精度(如果数据可以在1秒内多次更改),请考虑使用ETag代替Last-Modified

  

如果缓存中有最新版本,为什么Last-Modified甚至会将fetch()代码替换为304

因为通常人们只想获得新鲜的内容,无论它来自哪里。 304响应仅对那些实现自己的HTTP缓存的人感兴趣。