服务器对 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
我刚刚发现在网页审查器中,“已缓存:”Yes (disk)”并不代表该响应是从缓存还是服务器检索到的。有些请求显示为“已缓存:Yes (disk)”,但它们也同时出现在服务器日志中。
Safari
的一个bug(或特性)-有很多类似的问题。作为解决方法,您可以像这里描述的那样在URL
中使用随机参数https://dev59.com/fWkw5IYBdhLWcg3wXZX8。还请查看此SO讨论:https://dev59.com/FGcs5IYBdhLWcg3w433H - SergeyLebedev