【发布时间】: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 标头和浏览器缓存应该可以实现相同的功能。
【问题讨论】:
标签: ajax google-chrome caching xmlhttprequest cache-control