美文网首页
HTTP - 强缓存与协商缓存

HTTP - 强缓存与协商缓存

作者: ElricTang | 来源:发表于2019-10-20 21:33 被阅读0次

    何时使用强缓存?何时使用协商缓存?

    • 在第一次请求时,浏览器获得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。

    相关文章

      网友评论

          本文标题:HTTP - 强缓存与协商缓存

          本文链接:https://www.haomeiwen.com/subject/pyahmctx.html