“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”在离线时失败,即使响应被缓存的主要内容,如果未能解决你的问题,请参考以下文章