HTTP缓存有多种规则,根据是否需要重新向服务器发起请求来分类,我们将其分为两大类
- 强制缓存
- 对比缓存
流程
强制缓存流程如下
对比缓存流程如下
强制缓存
我们知道,强制缓存在数据为失效的情况下,可以直接使用缓存数据
在没有缓存数据的情况下,像浏览器请求数据时,服务器会将数据和缓存规则一并返回,缓存信息包含在响应header中
对于强制缓存来说,响应header中会有两个字段来表明失效规则Expires/cache-Control
- Expires
值为服务端返回的到期时间,在下一次请求时,如果请求时间小于服务端的到期时间,则直接使用缓存数据
Expires是HTTP1.0的东西,现在默认浏览器均使用HTTP1.1,使用Cache- Control替代,所以他的作用基本被忽略
另一个问题就是,到期时间是由服务端产生的,但是客户端可能和服务端时间有误差,就会导致缓存命中的误差 - Cache-Control
常见的取值有private、public、no-cache、max-age,no-store,默认为prvate- private:客户端可以缓存
- public:客户端和代理服务器都可以缓存
- max-age = xxx: 缓存内容将在xxx秒后失效
- no-cache:缓存内容将在xxx秒失效
- no-cache:需要使用对比缓存来验证缓存数据
- no-store:所有内容都不会缓存,强制缓存,对比缓存都不会触发
如图表示缓存在31536000(365天)内都不会失效,可以直接从缓存数据库获取数据,直接使用
对比缓存
需要进行比较判断才可以使用缓存
对比缓存生效时,状态码为304,且报文大小和请求时间大大减少,原因是服务端在进行表示比较后,只返回header部分,通过状态码通知客户端使用缓存,不再需要将报文主题部分返回给客户端
对于对比缓存来说,缓存标识的传递是我们需要着重了解的,他在请求header
和响应header
间进行传递,分为两种标识传递
- Last-Modified/If-Modified-Since
- Last-Modified(响应头)
在服务器响应请求时,告诉浏览器资源的最后修改时间
- If-Modified-Since(请求头)
通过此字段通知服务器上次请求时,服务器返回资源最后修改时间,服务器收到后与Last-Modified进行比对
如果最后修改时间大于If-Modified-Since,说并被修改过,则响应整片资源内容,返回状态码200
如果小于等于If-Modified-Since,说明资源无新修改,响应304,告知浏览器继续使用所保存的cache
- Last-Modified(响应头)
- If-Modified-Since
- Etag:服务器响应请求后,告诉浏览器当前资源在服务器的唯一标识(声称规则由服务器确定)
- If-None-Match:再次请求服务器时,通过此字段通知服务器客户端缓存数据的唯一标识,服务器收到后发现有If-None-Match,则与Etag比对
不同:说明资源被修改过,则响应整片内容,返回200
相同:说明资源未被修改,响应304,告知浏览器继续使用保存的cache
- Etag:服务器响应请求后,告诉浏览器当前资源在服务器的唯一标识(声称规则由服务器确定)