与缓存相关的四个字段,为了好记忆,我们分为强缓存,协商缓存
强缓存:expires,cache-control
协商缓存:etag/if-none-match,last-modified/if-modified-since
expires
- expires有点过时的http头,替代头是cache-control(权重也没有cache-control:max-age高)
- expires表示一个绝对的过期时间,当资源被本地缓存后,再次请求这个资源,会与系统时间比对,如果系统时间没有超出,浏览器会直接返回缓存的资源,状态码200
- 缺点:会参照系统时间,系统时间可以人为设置,所以并不是很有效
cache-control
响应头最核心部分,可配置属性很多
属性名 | 作用 |
---|---|
public | 资源能被浏览器和中间代理缓存 |
private | 资源只能被浏览器缓存,默认值 |
no-cache | 配合协商缓存一起使用,请求时服务器会返回etag,再次请求会把etag的值作为请求头if-none-match的值,对比是否一样,一样返回304使用本地资源,不一样返回200表示服务端资源改变 |
no-store | 不使用缓存 |
max-age | 设置缓存时长,单位是秒,下次请求如果在时间内,直接使用内存缓存,状态码200 |
s-maxage | 设置缓存时长,针对代理服务器,对浏览器没有效果 |
… | … |
etag/if-none-match
etag:资源唯一标识
当再次请求服务器 ,请求头中会加入if-none-match,if-none-match的值等于etag的值
场景:
当响应头cache-control:max-age过期,且之前缓存服务器给了etag 字段,我们刷新请求,请求头会携带if-none-match(etag的值),如果最新版本etag与if-none-match的值一样,返回304,浏览器直接使用本地缓存。不一样状态码200,浏览器缓存最新资源。
last-modified/if-modified-since
标识资源最后更改时间,优先级比etag低,用法与etag/if-none-match相同