简介
浏览器缓存是浏览器在本地磁盘对用户最近请求过的文档进行存储,当访问者再次访问同一页面时,浏览器就可以直接从本地磁盘加载文档。
主要分两种:
- 强缓存
- 协商缓存 两者的共同点是,都是从客户端缓存中读取资源;区别是强缓存不会发请求,协商缓存会发请求
| 标题 | 获取资源形式 | 状态码 | 发送请求到服务器 |
|---|---|---|---|
| 强缓存 | 从缓存取 | 200(from cache) | 否,直接从本地缓存取 |
| 协商缓存 | 从缓存取 | 304(not modified) | 是,通过服务器来告知本地缓存是否可用 |
强缓存
当浏览器去请求服务端资源的时候,服务端就在respone header里面对该资源做了缓存配置。缓存的时间、缓存类型都由服务端控制,具体表现为:respone header 的cache-control,常见的设置是max-age public private no-cache no-store等,如果你设置了cahe-control:max-age=31536000,public,每次用户正常打开这个页面,浏览器会判断缓存是否过期,没有过期就从缓存中读取数据。
Cache-Control头用来区分对缓存机制的支持情况, 请求头和响应头都支持这个属性。通过它提供的不同的值来定义缓存策略,值可以取多个。
-
private:仅浏览器可以缓存
-
public:浏览器和代理服务器都可以缓存
-
max-age=xxx:表示资源能够被缓存(保持新鲜)的最大时间
-
no-cache:不会走强缓存
-
no-store:不缓存,这个会让客户端、服务器都不缓存
协商缓存
向服务器发送请求,服务器会根据这个请求的request header的一些参数来判断是否命中协商缓存,如果命中,则返回304状态码并带上新的response header通知浏览器从缓存中读取资源;
response header里面的设置:
etag: '4a10casd-d3a8'
last-modified: Mon, 24 Dec 2021 10:51:03 GMT
- etag:每个文件有一个,改动文件了就变了,就是个文件hash。
- last-modified:文件的修改时间,精确到秒
每次请求返回来 response header 中的 etag和last-modified,在下次请求时在 request header 就把这两个(etag赋值给If-None-Match,last-modified赋值给If-Modified-Since)带上,服务端把你带过来的标识和当下资源的etag和last-modified进行对比,然后判断资源是否更改了,如果资源修改了,返回200,返回最新的资源,如果没有修改返回304,读取本地资源。