【问题标题】:macOS Safari caching response, while headers specify no cachingmacOS Safari 缓存响应,而标头指定不缓存
【发布时间】:2019-01-24 07:06:03
【问题描述】:

服务器对 GET 请求的响应具有以下标头:

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Pragma: no-cache
Date: Thu, 08 Feb 2018 19:16:26 GMT
Cache-Control: no-cache, no-store, must-revalidate
Server: Microsoft-IIS/10.0
Content-Length: 801
Expires: -1
Content-Encoding: deflate
X-Powered-By: ASP.NET
X-AspNet-Version: 4.0.30319
X-AspNetMvc-Version: 5.2

现在 4 秒后,浏览器 (macOS Safari 11.0.3) 发出相同的请求。开发人员控制台显示响应是从缓存中提供的。我不明白为什么 Safari 甚至会缓存响应:

  • Expires 是无效值,不应缓存响应
  • Cache-Control: no-cache,响应不应该被缓存
  • Cache-Control: no-store,响应不应该被缓存
  • Cache-Control: must-revalidate,至少应该验证响应,服务器日志中没有这样的请求
  • Pragma: no-cache,响应不应该被缓存

因此,尽管所有标头都明确说明是否应缓存响应,Safari 还是选择缓存响应。为什么?

为了完整起见,请求如下所示:

GET (...) HTTP/1.1
Host: (...)
Referer: (...)
Accept: application/json, text/javascript, */*; q=0.01
Connection: keep-alive
Accept-Encoding: br, gzip, deflate
Accept-Language: en-us
DNT: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/604.5.6 (KHTML, like Gecko) Version/11.0.3 Safari/604.5.6
Cookie: (...)
X-Requested-With: XMLHttpRequest

我刚刚发现在网络检查器Cached: "Yes (disk)" 中,与响应是从缓存还是从网络服务器检索无关。有些请求显示为“是(磁盘)”,同时它们也显示在服务器日志中。

【问题讨论】:

标签: caching safari


【解决方案1】:

我也遇到过类似的问题(请参阅Safari Caching GET request even with disabled cache)。添加Vary: * 强制Safari 停止缓存。尽管 cookie 在请求之间发生了变化,但没有其他方法起作用,包括 Vary: Cookie

这个答案帮助了我: https://stackoverflow.com/a/2068353/1364158

【讨论】:

  • 有了这个评论,你给了我一个星期五晚上的礼物,我说“谢谢”..
  • 谢谢你,@SamuelHapak - 我一直在与 Safari 的激进缓存作斗争(看起来比所有其他浏览器都更具侵略性),尝试了 Cache-Control: 标头的各种变体(@987654326 @ 等)但是,在我阅读您上面的答案之前,我不知道 Vary: 标头和 Vary: * 覆盖所有其他客户端假设和 坚持 所请求的资源 必须从源服务器获取。
  • 有谁知道哪个特定的标头值(Vary)实际上使 Safari 不缓存页面?无论出于何种原因,我用来托管我的应用程序的服务都不允许我执行Vary: *
猜你喜欢
  • 1970-01-01
  • 2017-03-22
  • 1970-01-01
  • 2018-04-29
  • 2016-05-05
  • 2017-12-29
  • 1970-01-01
  • 2020-01-18
  • 2019-10-04
相关资源
最近更新 更多