浏览器缓存是指浏览器在本地磁盘对用户最近请求过的文档进行存储,当用户再次访问同一页面、请求同一资源时,浏览器就可以直接从本地磁盘中加载。这样的好处是:减少冗余数据传输、减轻服务器负担、加快客户端加载网页的速度。
浏览器缓存分为强制缓存和协商缓存
- 强制缓存
HTTP响应头中,Cache-Control(HTTP 1.1)和Expires(HTTP 1.0)字段都表示对本资源启动强制缓存,Cache-Control优先级更高、使用更广泛。
Cache-Control: max-age=3600 (单位:秒)
Cache-Control常用值
- no-cache:不使用本地缓存,需使用协商缓存
- no-store: 本资源禁止浏览器缓存数据
- public:可以被所有用户缓存,包括终端用户和CDN等中间代理服务器
- private: 只能被终端用户的浏览器缓存
Expires字段规定过期时间,再次加载资源时,如果在过期时间内,则命中强制缓存。
- 协商缓存
客户端先从本地缓存中获得一个缓存标识,带着这个标识向服务器发送验证请求。如果缓存没有失效,服务端返回304,此时直接从本地缓存中获取数据;如果缓存失效,则从服务端获取数据。
协商缓存标识: Last-Modified和Etag
Last-Modified: 资源被服务器返回时,响应头中此标识会记录资源在浏览器上的最后修改时间。浏览器再次请求时,会将上次Last-Modified的值作为请求头If-Modified-Since头的值发送,服务器收到后,会查看最后修改时间以后,资源是否被改动过,如果没改动就返回304,否则返回状态码200以及整个资源。
Etag: 资源被服务器返回时,服务器通过算法生成针对这个资源的唯一标识作为Etag的值返回给浏览器。下次再次请求时,浏览器将上次的Etag值作为这个请求头的值发送给服务器。服务器通过这个标识检测资源是否被修改过,如果没有改动,返回304,否则返回200及整个资源。
Last-Modified的时间单位是秒,而Etag每次改变都能确保精度;性能上Etag因为需要算法计算出一个hash值,因此差于Last-Modified。
优先级上,服务器校验资源新鲜度优先考虑Etag。
网友评论