HTTP 缓存
缓存的分类
缓存可以被归类为两种主要的类别:私有缓存与共享缓存。共享缓存可以为不止一位用户的复用来储存响应。私有缓存独属于单个用户。
私有浏览器缓存
浏览器的缓存会被用来前进、后退、保存、查看源文件等,不需要额外请求服务器。
共享代理缓存
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
HTTP 的缓存验证分为两部分:Freshness 与 Validation。
根据相应头部的 Cache-Control: max-age
和 Expires
可以判断缓存的内容是否新鲜。如果内容新鲜,则直接读取缓存,这时从 Network Panel 中能看到 200 (from disk cache),这一部分并不会发送请求到服务器。如果内容不新鲜,则读取 Last-Modified
和 ETag
,发送校验请求,头部附上 If-Modified-Since
或 If-None-Match
,服务器判断缓存是否与当前的资源相同,若相同,则返回 304 (Not Modified),若不同,则返回 200 与新的数据。