请解释 Cache-Control、Expires、Last-Modified 和 ETag 等 HTTP 缓存头的作用和用法

推荐答案

Cache-Control

Cache-Control 是 HTTP/1.1 中用于控制缓存行为的头字段。它可以通过设置不同的指令来控制缓存的行为,例如 max-ageno-cacheno-store 等。

  • max-age=<seconds>:指定资源的最大缓存时间,单位为秒。例如 max-age=3600 表示资源可以在缓存中存储 1 小时。
  • no-cache:强制客户端在使用缓存前向服务器验证资源的有效性。
  • no-store:禁止缓存存储任何响应内容,通常用于敏感数据。

Expires

Expires 是 HTTP/1.0 中用于指定资源过期时间的头字段。它指定了一个具体的日期和时间,表示在此时间之前,资源可以被缓存使用。

  • 例如 Expires: Wed, 21 Oct 2025 07:28:00 GMT 表示资源在 2025 年 10 月 21 日之前可以被缓存使用。

Last-Modified

Last-Modified 是服务器返回的资源最后修改时间的头字段。客户端可以通过 If-Modified-Since 请求头将上次获取资源的时间发送给服务器,服务器会根据资源的最后修改时间判断是否需要返回新的内容。

  • 例如 Last-Modified: Wed, 21 Oct 2020 07:28:00 GMT 表示资源最后修改时间为 2020 年 10 月 21 日。

ETag

ETag 是服务器返回的资源唯一标识符的头字段。它是一个字符串,通常由服务器根据资源内容生成。客户端可以通过 If-None-Match 请求头将上次获取资源的 ETag 发送给服务器,服务器会根据 ETag 判断资源是否发生变化。

  • 例如 ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4" 表示资源的唯一标识符。

本题详细解读

Cache-Control 与 Expires 的区别

  • Cache-Control 是 HTTP/1.1 的产物,提供了更灵活的缓存控制方式,支持多个指令。
  • Expires 是 HTTP/1.0 的产物,只能指定一个具体的过期时间,且依赖于客户端和服务器的时钟同步。

Last-Modified 与 ETag 的区别

  • Last-Modified 是基于时间的缓存验证机制,依赖于资源的最后修改时间。
  • ETag 是基于内容的缓存验证机制,依赖于资源的唯一标识符,能够更精确地判断资源是否发生变化。

使用场景

  • Cache-ControlExpires 通常用于控制资源的缓存时间,减少不必要的请求。
  • Last-ModifiedETag 通常用于缓存验证,确保客户端获取的资源是最新的。

最佳实践

  • 在现代 Web 应用中,推荐优先使用 Cache-Control 来控制缓存行为,因为它提供了更丰富的指令和更灵活的配置。
  • 对于缓存验证,推荐使用 ETag,因为它能够更精确地判断资源是否发生变化,避免因时间同步问题导致的缓存失效。
纠错
反馈