[关闭]
@Dale-Lin 2023-03-09T15:01:23.000000Z 字数 2511 阅读 206

web 缓存机制

web开发技术


Web 缓存的类型


浏览器缓存

Web缓存器(Web cache)也叫代理服务器(proxy server),它是能够代表初始 Web 服务器来满足 HTTP 请求的网络实体。Web cache 有自己的磁盘存储空间,并在存储空间内保存最近请求过的对象的副本。

举例来说,例如浏览器在请求 'https://www.someschool.edu/campus.gif',将会发生以下情况:

  1. 浏览器创建一个到 Web cache 的 TCP 链接,并向 Web 缓存器中的对象发送一个 HTTP 请求;
  2. Web cache 进行检查,看本地是否存储了该对象副本。如果有,Web cache 用存储的对象返回响应报文。
  3. 如果没有,Web cache 打开一个与该对象的初始服务器的 TCP 连接,Web cache 在自己和初始服务器的 TCP 连接上发送一个该对象的 HTTP 请求。收到该请求后,初始服务器向该 Web cache 发送具有该对象的 HTTP 响应。
  4. Web cache 接收到该对象时,在本地存储一份副本,并向客户的浏览器用 HTTP 响应报文发送该副本。

浏览器的缓存规则由在 HTTP 头中的定义规定。
验证由两方面组成:

过期

Last-Modified 响应头部返回了资源最后更改的时间。

浏览器再次请求该资源时,协商使用缓存。一个足够新的缓存必须满足两个条件之一:
1. 含有完整的过期时间 HTTP 头,且仍在有效期内。
2. 浏览器使用过该缓存,并且在一个会话中用 If-Modified-Since: Date 检查过在缓存日期后没有发生变更。

If-Modified-Since 只能用于 GET 或者 HEAD 请求。非安全请求,例如,POST 只能使用 If-Unmodified-Since

实体标签(entity tag,ETag

ETag: W/"<etag_value>"ETag: "<etag_value>" 首部是资源特定版本的标识。在资源没有发生变更时,使用缓存更高效,并能节省带宽。特殊的以 W/ 开头表示这是一个弱校验,只要资源的语义没有发生改变就认为相等,而不是 byte-for-byte 的相同。

在浏览器再次访问一个具有 ETag 首部的资源时,Web cache 会通过 If-None-Match: "<etag_value>" 首部来校验资源是否发生了变更,如果没有变更,服务器返回 304 Not Modified 协商缓存。

如果只有 Last-Modified 信息,缓存寿命 = (Date - Last-Modified) / 10。


控制浏览器缓存

规则 报头 值/示例 类型 作用
新鲜度 Expires Sun, 16 Oct 2016 04:43:02 GMT 响应 告知浏览器过期前可以使用缓存副本
Pragma no-cache 响应 告知浏览器忽略资源的缓存(http1.1 可用 cache-control)
Cache-Control no-cache 响应 告知浏览器忽略资源的缓存,强制每次请求直接发给源服务器进行协商(即使缓存新鲜也发送条件请求)
no-store 响应 强制缓存不保留
max-age=[second] 响应 指明缓存有效时长秒数
public 响应 任何途径的缓存者都可以缓存
private 响应 只针对单个用户或实体缓存
Last-Modified Sun, 16 Oct 2016 04:43:02 GMT 响应 告知浏览器当前资源的最后修改时间
If-Modified-Since Sun, 16 Oct 2016 04:43:02 GMT GET/HEAD 请求 如果浏览器第一次请求时的 Last-Modified 值,会在第二次请求同一资源时作为该项发送
If-Unmodified-Since Wed, 21 Oct 2015 07:28:00 GMT POST 请求 同上
校验值 ETag 50b1c1d4f775c61:df3 响应 告知浏览器当前资源在服务器的唯一标识符
If-None-Match 50b1c1d4f775c61:df3 请求 浏览器第一次请求获得的 Etag 会在第二次请求同一资源时作为该项发送
辅助 Vary Accept-Encoding 响应 辅助从多个缓存副本中筛选适合的版本

校验值优先级比新鲜度高,同时存在的情况下新鲜度会失效。
和资源的 Date 头部日期进行比较。


http 304 Not Modified

告知浏览器资源未修改,使用缓存并更新缓存时间。


不能被浏览器缓存的请求

  1. HTTP 信息头中包含 Cache-Control:no-cache,pragma:no-cache,或Cache-Control:max-age=0 等告诉浏览器不用缓存的请求。
  2. 需要根据 Cookie,认证信息等决定输入内容的动态请求是不能被缓存的。
  3. 经过 HTTPS 安全加密的请求。
  4. POST 请求。
  5. HTTP响应头中不包含 Last-Modified/Etag,也不包含Cache-Control/Expires 的请求无法被缓存。
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注