强缓存
| 名称 | 规范 | 描述 |
|---|---|---|
| Expires | http1.0 | 值为绝对时间GMT 格式的字符串,代表缓存资源的过期时间 |
| Cache-Control:max-age | http1.1 | 利用 max-age 值判断缓存资源最大生命周期,值单位为秒 |
Cache-Control 其他常用值
- max-age:用来设置资源(representations)可以被缓存多长时间,单位为秒;
- s-maxage:和max-age是一样的,不过它只针对代理服务器缓存而言;
- public:指示响应可被任何缓存区缓存;
- private:只能针对个人用户,而不能被代理服务器缓存;
- no-cache:强制客户端直接向服务器发送请求,也就是说每次请求都必须向服务器发送。服务器接收到请求,然后判断资源是否变更,是则返回新内容,否则返回304,未变更。这个很容易让人产生误解,使人误以为是响应不被缓存。实际上Cache-Control: no-cache是会被缓存的,只不过每次在向客户端(浏览器)提供响应数据时,缓存都要向服务器评估缓存响应的有效性。
- no-store:禁止一切缓存(这个才是响应不被缓存的意思)。
协商缓存
| 名称 | 规范 | 描述 |
|---|---|---|
| Last-Modified | http1.0 | 值为资源最后更新时间,随服务器response返回,即使文件改回去,日期也会变化 |
| If-Modified-Since | http1.0 | 通过比较两个时间来判断资源在两次请求期间是否有过修改,如果没有修改,则命中协商缓存 |
| ETag | http1.1 | 表示资源内容的唯一标识,随服务器response返回,仅根据文件内容是否变化判断 |
| If-None-Match | http1.1 | 服务器通过比较请求头部的If-None-Match与当前资源的ETag是否一致来判断资源是否在两次请求之间有过修改,如果没有修改,则命中协商缓存 |
技术演进
强缓存
- expires 由于浏览器时间可以通过设置改变
- cache-control 返回相对时间
协商缓存
资源没有更新,但强缓存时间过期,重新拉取资源。
- last-modified 设置的时间是 秒,如果 1s 内资源有修改,浏览器返回的最后修改时间和上次修改时间相同,还是取值协商缓存,不会重新拉取资源。
- e-tag 就通过比对资源内容来判断是否修改。