HTTP的强缓存与协商缓存

108 阅读3分钟

强缓存

HTTP 强缓存是一种在客户端缓存中使用 HTTP 头信息来确定缓存资源是否可用的技术。它不需要向服务器发送请求即可检查缓存是否过期,从而有效地减少了网络流量和资源请求的响应时间。HTTP 强缓存有两个主要的响应头信息:

Cache-Control: 确定缓存机制的行为选项。可以使用这个字段的值来控制在多长时间内缓存资源,以及何时必须重新验证资源是否过期。常见的 Cache-Control 值有:

  • max-age:缓存资源的最大有效时间(秒为单位)
  • no-cache:需要重新验证资源是否过期
  • no-store:禁止缓存资源

Expires: 用来设置资源的过期时间,这个字段的值是一个 GMT 格式的时间戳,指示资源何时将过期。服务器在 HTTP 响应头中设置 Expires 字段,告诉浏览器从服务器获取资源的最后期限。

如果浏览器检查到缓存资源仍然有效,则直接从缓存中读取资源。如果缓存过期,浏览器将向服务器发送请求,并在从服务端获取到资源后更新缓存。服务器可以使用 Cache-Control 或 Expires 响应头来设置缓存资源的有效时间。 需要注意的是,Cache-Control 和 Expires 两个响应头指令可以同时使用,Cache-Control 优先级更高,当两个指令在内部存在冲突时,Cache-Control 会覆盖 Expires。

协商缓存

HTTP协商缓存是一种Web性能优化技术,它允许缓存和服务器之间的交互以确定缓存副本是否仍然有效。如果缓存副本有效,服务器将返回304 Not Modified状态码,并指示浏览器使用缓存副本,否则将返回200 OK状态码并传输新的资源。 HTTP协商缓存的两个主要字段是:

ETag(实体标签):一个资源的唯一标识符,由服务器生成,并在每次资源发生变化时更改。服务器将ETag值发送给客户端,在后续请求中,客户端可以将其包含在If-None-Match请求头中,以检查资源的有效性。 Last-Modified(上次修改时间):资源的最后修改时间,在每次资源修改时更新。服务器将资源的最后修改时间发送给客户端,并在后续请求中,客户端可以将其包含在If-Modified-Since请求头中以检查资源的有效性。

当浏览器向服务器请求资源时,它会将当前缓存副本的ETag值和Last-Modified时间包含在请求头中。服务器可以使用这些值与资源的当前状态进行比较,以确定是否需要发送新的资源。 如果服务器判断缓存副本是最新的,则返回HTTP响应码304 Not Modified,并在响应头中包含ETag和/或Last-Modified字段。浏览器接收到这个响应后,会使用缓存副本,而不是下载新的资源。 如果服务器判断缓存副本已过期,则返回HTTP响应码200 OK,并传输新的资源。新的资源的ETag和Last-Modified值将包含在响应头中,并用于后续请求的协商缓存检查。

缓存.png