1. 浏览器缓存两大策略
强缓存: 不会向服务器发送请求, 直接命中内存中的缓存资源, 从 chrome Network 中可以看到资源 200 且 from disk cache 或 from memory cache.
协商缓存: 向服务器发送请求, 服务器根据 request header 内的参数来判断是否需要更新此资源, 如果不需要更新, 服务器返回 304 的状态码, 然后通知浏览器读取本地缓存.
2. 控制强缓存
强缓存主要由以下几个 key 决定.
http response header key | description |
---|---|
Cache-Control | http1.1 最主要的 key,指定缓存机制 |
Pragma | http1.0 指定缓存机制 当 Pragma:no-cache 时等同于 Cache-Control:no-cache(在浏览器中 disable cache 就是在所有请求的请求头上加上 Pragma:no-cache) |
Expires | http1.0 指定缓存的过期时间,当和 Cache-Control 同时存在时优先取 Cache-Control 的值 |
强缓存示例
Cache-Control 内又有多个属性值, 常见的是 max-age, 指定资源缓存的过期时间 (s), 例如:
Cache-Control : max-age=300
那么所有在 300 秒内的资源都将被强制缓存, 也就是 from disk cache 或 from memory cache.
超过 300 秒又会去重新请求服务器.
Pragma 一般用于调试, 现在在 response 头上手动处理 Pragma 的很少很少.
Expires 和 max-age 类似, 差别在于 expires 是一个固定的服务器时间点.
3. 控制协商缓存
控制协商缓存的主要是 ETag 和 last-modified.
http response header key | http request headerkey |
---|---|
ETag(服务端返回的当前资源的 etag 值) | If-None-Match(上一次服务器对于当前资源返回的 etag 值) |
Last-Modified(服务端返回的当前资源的最后修改时间) | If-Modified-Since(上一次服务器对于当前资源返回的最后修改时间) |
协商缓存示例
在请求服务器的时候, 服务层会优先校对当前 request 的 If-None-Match 和 If-Modified-Since, 如果经过判断和之前的资源一致, 那么服务端就会返回一个 304, 通知浏览器去缓存中读取该资源.
来源: http://www.jianshu.com/p/4997bb3322d9