浏览器的缓存机制
1是什么?
把已经请求过一次的web资源(比如html页面,图片,js,data等),拷贝一份到浏览器缓存中。key=资源标识,value:数据。当下一次请求同样的资源一样,如果缓存数据没过期,会重缓存数据里面获取
2:为什么?
减少网络IO,减少宽带,降低服务器压力,响应更快,用户体验更好
3.缓存的规则
(1)新鲜度 优先级高于校验值
在两种情况下会取缓存数据:
(1.1)含有完整过期时间控制head信息,并且没有过期
(1.2)浏览器已经使用过该缓存副本,并且在一个会话中检查过新鲜度
(2)校验值
资源有一个标签值(hash5)。客户端访问服务器资源带上这个标签,如果服务器判断资源未更新,会返回304,告诉client缓存数据可用,并不会返回数据。特别是一些静态文件。如果过期则返回200和数据
4浏览器缓存控制流程
规则 | 消息包头 | 值/示例 | 类型 | 作用 |
新鲜度 | expires | Mon, 15 Aug 2016 03:56:47 GMT | 响应 | Http1.0会使用,资源超时时间,有一个问题,客户端时间和服务器时间的一致性 |
Cache-control | no-cache | 响应 | 忽略缓存副本,实时获取资源,但不是不缓存 | |
no-store | 响应 | 强制浏览器不缓存副本 | ||
Max-age=[second] | 响应 | 缓存副本的有效时间,资源在多少second之后超时 | ||
public | 响应 | 任何路径的缓存者(本地缓存、代理服务器),可以无条件的缓存改资源 | ||
private | 响应 | 只针对单个用户或者实体缓存资源 | ||
Last-modify | Mon, 15 Aug 2016 03:56:47 GMT | 响应 | 返回资源的时候返回该资源的1最近更新时间,隐患:最多具体到s | |
If-modify-since | Mon, 15 Aug 2016 03:56:47 GMT | 请求 | 如果该资源已经过期,客户端请求带上该字段,server可以判断该资源是否最新的,如果是,返回304,更新资源的过期时间等, 告诉客户端缓存资源依然可用 | |
校验值 | ETag | "fd56273325a2114818df4f29a628226d" | 响应 | 根据资源内容或着其他方式生成的一个标识资源的符号 |
If-None-Match | "fd56273325a2114818df4f29a628226d" | 请求 | 当资源过期,带上该标识,原理如同modify_time |
5.浏览器HTTP请求流程
6.用户行为与缓存
浏览器缓存行为还有用户的行为有关,具体情况如下:
用户行为 | expires/cache-control | Etag/last-modify |
地址栏回车 | 有效 | 有效 |
页面链接跳转 | 有效 | 有效 |
新开窗口 | 有效 | 有效 |
前进后退 | 有效 | 有效 |
F5 | 无效 | 有效 |
Crtl+F5 | 无效 | 无效 |
7.不能缓存的请求
1.http head告诉浏览器不用缓存
比如Cache-Control:no-cache,,或Cache-Control:max-age=0等告诉浏览器不用缓存的请求
2.http 没有协商缓存
比如head不存在cache-control,etag,last-modify等
2.https安全加密的无法缓存
3.Post请求无法缓存
4.head