即使缓存响应,“Cache-Control:only-if-cached”也会在脱机时失败

时间:2016-12-06 16:19:46

标签: ajax google-chrome caching xmlhttprequest cache-control

我正在开发一个基于Web视图的移动应用程序和一个基于express.js的后端。从技术上讲,它归结为嵌入式Chrome浏览器和HTTP端点。

在我的应用程序中,我有一个仪表板,我希望它的行为方式如下:

  1. 从服务器获取最新数据(服务器始终使用200 OK响应有效负载和Last-Modified标头,或304 Not Modified且没有内容)
    • 如果浏览器尚未缓存响应 - 请使用Cache-Control: max-age=0
    • 执行正常请求
    • 否则 - 始终使用If-Modified-Since标题
    • 执行条件请求
  2. 如果脱机/网络错误 - 退回浏览器缓存
    • 执行Cache-Control: only-if-cached请求,该请求应该产生缓存的响应,如果没有找到则会失败。
  3. 问题在于,当服务器关闭时,Cache-Control: only-if-cached的回退请求总是失败。特别是,即使浏览器缓存了响应,它也会失败(我知道它它是否已缓存,因为首先我得到200 OK,并且在第二个请求中,即使收到304 Not Modified - 它没有内容,它也会产生响应内容。那么为什么失败呢?或者我应该如何构建与缓存相关的标题,以便它按照描述工作?

    我正在跑步:

    • Chrome WebView v54
    • github / fetch polyfill(但它真的不重要,因为我在裸HTTP头上操作)
    • express.js 4.14.0,禁用ETag

    其他说明:我可能会使用服务工作者,以便仪表板脱机工作,但我相信使用普通的HTTP标头和浏览器缓存可以实现相同的功能。

1 个答案:

答案 0 :(得分:0)

是的,这应该可以通过HTTP定义的缓存行为实现,但前提是浏览器支持该规范。

在Chromium的来源中,only-if-cached似乎只出现在第三方模块中(only-if-cached package:chromium)。这表明Chrome可能不支持标题。