“Cache-Control: only-if-cached”在离线时失败,即使响应被缓存

Posted

技术标签:

【中文标题】“Cache-Control: only-if-cached”在离线时失败,即使响应被缓存【英文标题】:"Cache-Control: only-if-cached" fails when offline even if response is cached 【发布时间】:2017-04-21 08:50:07 【问题描述】:

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

在我的应用中,我有一个仪表板,我希望它以这种方式运行:

    从服务器获取最新数据(服务器总是以200 OK 响应,带有有效负载和Last-Modified 标头,或者304 Not Modified 并且没有内容) 如果浏览器还没有缓存响应 - 使用Cache-Control: max-age=0 进行正常请求 否则 - 始终使用 If-Modified-Since 标头执行条件请求 如果脱机/网络错误 - 回退到浏览器缓存 执行Cache-Control: only-if-cached 请求,该请求应该产生缓存的响应,或者如果没有找到则失败。

问题是,当服务器宕机时,Cache-Control: only-if-cached 的回退请求总是失败。 特别是,即使浏览器缓存了响应,它也会失败(我知道它有缓存,因为首先我得到一个200 OK,然后在第二个请求中,即使收到304 Not Modified(没有内容),它也会产生响应内容。那么为什么会失败呢?或者我应该如何构造与缓存相关的标头以使其按描述工作?

我在跑步:

Chrome WebView v54 github/fetch polyfill(但这并不重要,因为我使用的是裸 HTTP 标头) express.js 4.14.0 禁用 ETags

其他注意事项:我可能会使用服务工作者,以便仪表板离线工作,但我相信使用普通 HTTP 标头和浏览器缓存应该可以实现相同的功能。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于“Cache-Control: only-if-cached”在离线时失败,即使响应被缓存的主要内容,如果未能解决你的问题,请参考以下文章