【发布时间】: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)" 中,与响应是从缓存还是从网络服务器检索无关。有些请求显示为“是(磁盘)”,同时它们也显示在服务器日志中。
【问题讨论】:
-
我确实发现了一个 webkit 的报告错误,可以解释这一点; bugs.webkit.org/show_bug.cgi?id=170714。甚至可能是 2011 年的这个错误报告:bugs.webkit.org/show_bug.cgi?id=62250。
-
相关问题,可能仅限于本地主机:stackoverflow.com/questions/46525065/….
-
这可能是
Safari错误(或功能) - 有很多类似的问题。作为一种解决方法,您可以在URL中使用随机参数,如此处所述stackoverflow.com/questions/9948545/…。也看看这个 SO 讨论:stackoverflow.com/questions/12506897/… -
您在测试之前确实清空了缓存对吧? (没有旧的缓存版本)...我在 Safari 中看到过类似的奇怪现象。