# 十.cache

# 1.是否禁止缓存

  • 禁止缓存指的是缓存中不得存储任何关于客户端请求和服务端响应的内容,每次由客户端发起的请求都会下载完整的响应内容。
  • 在请求头中,Cache-Control:no-storePragma:no-cache都可以禁止缓存
    • Pragma:no-cache可以兼容http 1.0
    • Cache-Control:no-storehttp 1.1提供的

# 2.是否检查本地副本是否过期

是否检查本地版本是否过期主要是由Cache-Controno-cachemust-revalidate这两个可选值控制,其中:

  • no-cache告诉浏览器、缓存服务器,不管本地副本是否过期,使用资源副本前,一定要到源服务器进行副本有效性校验。
  • must-revalidate告诉浏览器、缓存服务器,本地副本过期前,可以使用本地副本;本地副本一旦过期,必须去源服务器进行有效性校验。

# 3.本地副本是否过期

想要知道本地副本是否过期,我们就要了解缓存的过期机制

  • 1.过期机制中,最重要的指令是max-age=<seconds>,它表示资源能够被缓存的最大时间;它通常会和must-revalidate一起使用
Cache-Control:nax-age=60,must-revalidate
1
  • 2.如果不含有max-age属性,则会去查看是否包含Expires属性,通过比较Expires的值和响应头里面Date属性的值来判断缓存是否有效。
  • 3.如果max-ageexpires属性都没有,可以查看响应头里面的Last-Modifined信息。如果有,缓存的寿命就等于响应头里面Date的值减去Last-Modified的值除以 10

# 4.如果本地副本没有过期

如果本地副本没有过期,自会直接从缓存中读取资源,并返回 200 状态

# 5.如果副本过期

如果副本过期,则会进行到源服务器进行有效性校验的前期准备

  • 首先,会在请求头里寻找If-None-Match字段,其值为服务器上次返回的ETag响应头的值:
  • 如果请求头里面没有if-None-Match字段,怎会在请求头中寻找if-Modified-Since字段,其值为服务器上次返回的Last-Modified响应头中的日期值

# 6.到源服务器进行有效性校验

如果请求头中带有if-None-Matchif-Modified-Since,则会到源服务器机进行有效性校验,如果源服务器资源没有变化,则返回 304,如果有变化,则返回 200