强制缓存
1.请求数据流程
- 浏览器请求数据→已有缓存数据→直接使用缓存数据
- 浏览器请求数据→无缓存数据→向服务器请求数据→将数据和规则存入缓存
2.如何判断是否过期
强制缓存是否过期由时间判断,主要通过Expire和cache-control两个规则字段。
期中Expire是HTTP1.0下的标准字段,已经过时。
- cache-control是HTTP消息头,常用取值和意义如下:
private:客户端可以缓存
public:客户端和服务器都可以缓存
max-age=xxx:表示缓存数据于XXX秒后失效
no-cache:表示缓存数据需要对比缓存来验证
no-store:不缓存内容,强制缓存、对比缓存都不触发
对比缓存
1.请求数据流程
- 缓存命中:浏览器获取缓存数据的标识→请求服务器验证缓存标识对应的数据是否失效→通知浏览器数据未失效→获取缓存数据
- 缓存未命中:浏览器获取缓存数据的标识→请求服务器验证缓存标识对应的数据是否失效→返回最新的数据和缓存规则
2.如何判断是否过期
浏览器第一次访问网页返回的状态码为200,第二次访问且对比缓存生效状态码为304。
对比缓存有两种状态标识,在request-header和response-header之间传递:
1.Last-Modified/Last-Modified-Since
- Last-Modified 字段表示资源最后修改的时间(服务器上文件修改的时间),位于response-header中。
- Last-Modified-Since 字段位于request-header中表示上次请求时,资源最后修改的时间(本地文件修改的时间)。这个时间发送给服务器进行比较,如果修改过了返回200,如果没修改过返回304直接使用缓存。
2.ETag
ETag是服务器返回的资源标识符,当资源发生变化时ETag的值也会发生变化,借此可以判断资源是否发生改变。
为什么有了Last-Modified/Last-Modified-Since还要有ETag?
1.Last-Modified/Last-Modified-Since的修改时间只能精确到秒,如果文件在一秒内被修改多次,那么仅靠时间对比无法出区分新旧。
2.一些服务器不能精确得到文件的最后修改时间
3.一些文件会定时刷新,但是内容并不变。使用Last-Modified/Last-Modified-Since判断就无法使用缓存。