浏览器协商缓存跟强缓存笔记
强缓存
expire(过期时间)
缺点:如果服务端的时间和客户端的时间不一致就会导致缓存混乱问题所以引入cache-control
cache-control: | max-age=666(过期时间)
| no-cache(不适用强缓存,使用协商)
| no-store (不使用缓存,请求新的数据)
| public (可以被所有用户缓存)
| private (只能被浏览器缓存不能被cdn等代理服务器缓存)
issues: cache-control在请求头跟在响应头里含义不一样
请求头: 当只有客户端设置max-age:6666时不起作用,必须服务端设置。如果值为no-cache| no-store| max-age = 0 表示浏览器不读取缓存,直接请求新的资源,除非服务端对这个字段做特殊处理。
响应头:根据值使用不同的缓存方式,当值为no-cache| no-store| max-age = 0不做单独处理,从新请求资源
强缓存流程
有效时: 请求资源 => 浏览器缓存表读取且命中强缓存且没过期 => 去c盘读取文件 => 资源返回到浏览器
无效时: 请求资源 => 浏览器缓存表读取且命中强缓存但是过期了 => 走协商缓存


协商缓存
last-modified(最后的修改时间) 当再次请求时候会携带参数if-modified-Since(响应头的last-modified)如果时间相(文件没变动)就用本地缓存,相同返回状态码304
缺点:服务器不能精确最后修改时间或者只改了时间没改内容不希望重新请求所以引入Etag
Etag (类似md5值,文件的唯一标识)
当再次请求时候会携带参数if-None-Match(响应头的Etag)浏览器会对比返回304或者200
缺点: 每次请求服务端会根据资源生成一个Etag,影响性能
协商缓存流程
未改动: 请求资源 => 查询浏览器缓存表返回Etag跟Last-Modified => 请求头带上If-None-Match跟If-Modified-Since => 资源未改变返回304从本地缓存中读取
有改动: 请求资源 => 查询浏览器缓存表返回Etag跟Last-Modified => 请求头携带If-None-Match跟If-Modified-Since => 资源有改动返回200跟新的Etag跟last-Modified => 将新规则存入表中


浏览器缓存可以自定义请求头响应头缓存标识吗?
自我理解: 不可以浏览器使用缓存返回304,浏览器不认识自定义表示不知道使用那种缓存,可能请求不到资源?

浙公网安备 33010602011771号