自己的回答

强缓存
Expires: 绝对时间, 服务器时间和浏览器时间可能会不一致
Cache-Control: max-age: 相对时间

如果浏览器确认有强缓存, 直接返回, 不会发送请求

参考答案

强缓存:
浏览器中的缓存作用分为两个情况,一种是需要发送HTTP请求,一种是不需要发送 首先是检查强缓存,这个阶段不需要发送http请求 如何来检查呢?
通过相应的字段来进行,在http/1.0和http/1.1当中,这个字段是不一样的。
在早期,也就是http/1.0时期,使用的是Expires,而http/1.1使用的是Cache-Control

  • Expires

    Expries即过期的时间,存在于服务端返回的响应头中,告诉浏览器在这个过期时间之前可以直接从缓存里面获取数据,无需再次请求

  1. Expires: Wed, 22 Nov 2020 08:30:00 GMT
  2. 表示资源在20201122830分过期,过期了就得向服务端发送请求
  3. 这个方式看上去没什么问题,合情合理,但其实潜藏了一个坑,那就是服务器的时间和浏览器的时间可能并不一致,那服务器返回的这个过期时间可能就是不准确的,因此这种方式很快在后来的http/1.1版本就抛弃了。
  • Cache-Control

    在http1.1中,采用了一个非常关键的字段:Cache-Control。 它和Expires本质的不同在于它并没有采用具体的过期时间点这个方式,而是采用过期时长来控制缓存,对应的字段是max-age,比如这个例子:

  1. Cache-Control:max-age=3600
  2. 代表这个响应返回后在3600秒,也就是一个小时之内可以直接使用缓存
  3. 如果你觉得它只有max-age一个属性的话,那就想错了
  4. 它其实可以组合非常多的指令,完成更多的场景的缓存判断,将一些关键的属性列举如下:
  5. public:客户端和代理服务器都可以缓存。因为一个请求可能要经过不同的代理服务器最后才到达目标服务器,那么结果就是不仅仅浏览器可以缓存数据,中间的任何代理节点都可以进行缓存
  6. private:只有浏览器能缓存,中间的代理服务器不能缓存
  7. no-cache:跳过当前的强缓存,发送http请求,即直接进入协商缓存阶段
  8. no-store:非常简单粗暴,不进行任何形式的缓存
  9. s-maxage:这和max-age长得非常像,但是区别在于s-maxage是针对代理服务器的缓存时间。

值得注意的是:当Expires和Cache-Control同时存在的话,Cache-Control会优先考虑 还存在一种情况是:当资源缓存时间超时了,也就是强缓存失效了,接下就要进入第二部分—协商缓存Ï