caching - macOS Safari 缓存响应,而 header 指定不缓存

标签 caching safari

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

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:必须重新验证,至少应验证响应,服务器日志中没有此类请求
  • Pragma: no-cache,不应缓存响应

因此,尽管所有 header 都明确表明是否应缓存响应,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
<小时/>

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

最佳答案

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

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

关于caching - macOS Safari 缓存响应,而 header 指定不缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48693693/

相关文章:

javascript - Safari 和 Chrome 之间的 http/https 引用

html - Safari CSS 问题(负边距?)

ajax - 防止 AJAX 调用缓存在 Google Closure 库中

ruby - 通过在 Ruby on Rails 5 中配置 HTTP 头来进行静态资源缓存

caching - 需要帮助分析 VarnishStat 结果

javascript - 在 iPad 上绝对定位不会将元素设置在所需位置

javascript - javascript 变量过期?

python - 防止 web2py 缓存?

iphone - 为什么我的网页不能在 Iphone 浏览器中换行?

javascript - 如何使用javascript检测Safari 13上是否启用了防止跨站点跟踪