未指定强缓存的浏览器缓存策略

  • 2018-08-25
  • 102

在未指定强缓存相关响应头(Cache-Control 、 Expires 、 Pragma)的情况下,以我的认知,觉得浏览器应该把ETag发到服务器,然后服务器对文件做校验,是否需要更新,然后返回304200

事实上,目前Firfox(61.0.2)和Edge(42.17134.1.0)的行为确实与我的认知一致。但今天发现Chrome(68.0.3440.106)请求一个资源时,在第一次请求,服务端未返回任何强缓存头的情况下:
第一次请求

我F5刷新,第二次直接从本地读取了:

第二次请求

百思不得其解。

后面经过放狗搜索,找到了可以解释这一现象的资料:HTTP1.1中,对于服务端未明确指定Cache-Control的情况,浏览器的缓存策略可由浏览器厂商自行决定。参考RFC 2616

Unless specifically constrained by a cache-control (section 14.9)
directive, a caching system MAY always store a successful response
(see section 13.8) as a cache entry, MAY return it without validation
if it is fresh, and MAY return it after successful validation.

所以,若期望某资源不被缓存,需要在响应头中明确指定Cache-Control,不然,各家浏览器会实行自己的缓存策略了。

有句港句,对于协议这么正式的东西,不应该处处使用MUST么,怎么一段里面有这么多MAY,本来很多人对什么协商缓存啊、强缓存啊之类的已经傻傻分不清楚了,现在又整这么一出浏览器各自按心情来实现的方案,实在是令人费解。

不过,木已成舟,吐槽只能归吐槽,指不定大佬们有其它的考量呢。

写这篇文章的结论就是:规范还是要经常读。