# HTTP缓存机制

缓存和重用之前获取的资源对于性能优化很关键。

# 强缓存

字段名称 说明 适用http版本
Pragma cache-control: no-cache相同 1.0、1.1
Expires 设定“缓存过期时间” 1.0、1.1
Cache-Control 设定“缓存策略” 仅1.1

优先级:Pragma > Cache-Control > Expires

# Expires

Expires 的时间是 “服务器时间”,可能与 “客户端时间” 匹配不上,导致缓存失效

一般会用来处理 兼容 情况(包括 Pragma)。

# Cache-Control

选项:

  • max-age:最大周期(单位: s)
  • no-cache:客户端协商缓存
  • no-store:不缓存

Request HeaderResponse Header 都可以使用Cache-Control,区别在于:

  • 前者:指定 这个资源在本次请求的缓存策略

    如: 强制刷新F5时,请求头是cache-control: no-cache 告知服务器本次需要请求最新资源

  • 后者:告知 浏览器 针对 这个资源 的缓存策略

# 协商缓存

Response Header

字段名称 说明 适用http版本
Last-Modified 文件的最后一次修改时间 1.0、1.1
ETag 资源的唯一标识符 仅1.1

Request Header

字段名称 说明 适用http版本
If-Modified-Since 向服务器请求上次保存的 Last-Modified 1.0、1.1
If-None-Match 向服务器请求上次保存的 ETag 仅1.1

优先级:ETag > Last-Modified

# Last-Modified

可能进行误判。

例:资源A 已经被请求过,但是又重新生成(内容没变,但 Last-Modified 变了)

一般会用来处理 兼容 情况。

# ETag

服务端生成的 资源唯一标识符

# 浏览器的应对

  1. “服务器” 会通过 Response Header,携带以上四个常用(Cache-ControlExpiresLast-ModifiedETag)的响应头。
  2. “浏览器” 会通过判别这些响应值来决定 是否要使用缓存

在这段时间里,只能通过 强制刷新 来请求最新资源(前提是没有接入CDN)

TIP

刷新行为 Request Header会携带
F5、工具栏的刷新按钮 If-Modified-Since(如果上次Response里有Last-Modified)、If-None-Match(如果上次Response里有ETag
Ctrl + F5 Pragma: no-cacheCache-Control: no-cache

# HTTP缓存的应用

  • “强缓存” 通常只针对 “静态资源”、“接口” 使用。

  • “协商缓存” 针对 index.html:浏览器始终可以请求 “最新的资源”。

不能使用强缓存,因为没有机制能够通知浏览器这些 .html有更新。

# 参考链接

更新时间: 11/21/2021, 2:45:24 AM