HTTP - 强缓存与协商缓存
2019-10-20 本文已影响0人
ElricTang
何时使用强缓存?何时使用协商缓存?
- 在第一次请求时,浏览器获得Expires和Cache-Control信息。
- 在发生一次请求后的再次请求时:
- 浏览器会先获取该资源缓存的header信息,根据其中的expires和cache-control判断是否命中强缓存),若命中则直接从缓存中获取资源,包括缓存的header信息,本次请求不会与服务器进行通信;
- 如果没有命中强缓存,浏览器会发送请求到服务器,该请求会携带第一次请求返回的有关缓存的header字段信息(Last-Modified/IF-Modified-Since、ETag/IF-None-Match),由服务器根据请求中的相关header信息来对比结果是否命中协商缓存。若命中,则服务器返回新的响应header信息更新缓存中的对应header信息,但是并不返回资源内容,它会告知浏览器可以直接从缓存获取;否则返回最新的资源内容。
一. 强缓存(F5刷新无法触发,状态码200)
- Cache-Control优先级高于Expires
字段名 | 描述 | 可取值 |
---|---|---|
Expires | 资源的失效时间 | 绝对时间的GMT格式的时间字符串 |
Cache-Control | 控制缓存的行为 | public、private、no-cache、no-store、max-age等 |
- Cache-Control常用指令(http1.1版本才有Cache-Control)
指令名 | 描述 |
---|---|
public | 所有用户可缓存 |
private | 响应只以特定的用户作为对象 |
no-cache | 每次请求都与服务器确认资源是否更改(ETag),根据情况判断是否使用缓存。 |
no-store | 彻底不使用缓存,每次都重新下载资源 |
max-age | 设置缓存存储的最大周期,超过这个时间缓存被认为过期(单位秒)。与Expires相反,时间是相对于请求的时间 |
二. 协商缓存(状态码304)
响应头字段 | 请求头字段 | 描述 |
---|---|---|
Last-Modified | If-Modified-Since | http1.0策略 |
ETag | If-None-Match / If-Match | http1.1策略 |
- 首部字段 If-Modified-Since,属附带条件之一,它会告知服务器若If-Modified-Since 字段值早于资源的更新时间,则希望能处理该请求。
而在指定 If-Modified-Since 字段值的日期时间之后,如果请求的资源
都没有过更新,则返回状态码 304 Not Modified 的响应。获取资源的更新日期时间,可通过确认首部字段 Last-Modified 来确定。 - 服务器会比对 If-Match 的字段值和资源的 ETag 值,仅当两者一致时,才会执行请求。
- ETag判断资源修改更准确,If-Modified-Since只能检测到秒级别的修改。
- 优先验证ETag,ETag一致情况下再验证If-Modified-Since。