HTTP 缓存

缓存的分类

缓存可以被归类为两种主要的类别:私有缓存与共享缓存。共享缓存可以为不止一位用户的复用来储存响应。私有缓存独属于单个用户。

http cache type

私有浏览器缓存

浏览器的缓存会被用来前进、后退、保存、查看源文件等,不需要额外请求服务器。

共享代理缓存

ISP 或者你的公司可能会为许多用户架设代理来重用流行的资源、降低网络负载。

控制缓存

Cache-Control

完全不缓存

客户端请求或是服务器响应都不被存储。每次都会向服务器发送请求并下载完整的响应。

Cache-Control: no-store
Cache-Control: no-cache, no-store, must-revalidate

强制确认缓存

使用缓存的数据前向服务器发送请求确认缓存是否过期。

Cache-Control: no-cache

私有公共缓存

public 指响应可以被任何缓存服务缓存。它可以使页面带有 HTTP 验证或者响应的状态码通常不被缓存的被缓存。private 指响应是对应单个用户的,不应被共享缓存储存,只能保存在私有浏览器缓存中。

Cache-Control: private
Cache-Control: public

过期

max-age=<seconds> 是资源被认为新鲜的最大时间,与 Expires 不同,它是相对于请求时间的。

Cache-Control: max-age=31536000

验证

当时用 must-revalidate 指令时,缓存必须被验证新鲜状态,如果过期了便不被使用。

Cache-Control: must-revalidate

headers-cache

HTTP 的缓存验证分为两部分:Freshness 与 Validation。

根据相应头部的 Cache-Control: max-ageExpires 可以判断缓存的内容是否新鲜。如果内容新鲜,则直接读取缓存,这时从 Network Panel 中能看到 200 (from disk cache),这一部分并不会发送请求到服务器。如果内容不新鲜,则读取 Last-ModifiedETag,发送校验请求,头部附上 If-Modified-SinceIf-None-Match,服务器判断缓存是否与当前的资源相同,若相同,则返回 304 (Not Modified),若不同,则返回 200 与新的数据。