SkyBlog

HTTP 缓存标头

这篇文章发布于 2024年08月12日,星期一,09:32阅读 ? 次,0 条评论

在 HTTP 协议中,缓存标头用于控制浏览器或其他客户端如何缓存和重新验证资源。这些标头有助于提高网页加载速度,减少带宽使用,减轻服务器压力。以下是常见的 HTTP 缓存标头:

Cache-Control

Cache-Control 是最常用的缓存控制标头,它提供了多个指令来控制缓存的行为。常见的指令包括:

  • 可缓存性

    • public: 允许任何缓存(包括浏览器和代理服务器)缓存该响应
    • private: 只允许浏览器缓存,不允许代理服务器缓存
    • no-cache: 强制客户端在使用缓存副本前重新验证资源
    • no-store: 完全禁止缓存,资源不会被存储在缓存中
  • 到期

    • max-age=<seconds>: 指定资源可以被缓存的最长时间(以秒为单位)
    • s-maxage=<seconds>: 覆盖 max-age 或者 Expires 头,但是仅适用于共享缓存 (比如各个代理),私有缓存会忽略它
    • stale-while-revalidate=<seconds>: 客户端愿意接受陈旧的响应,同时在后台异步检查新的响应。秒值指示客户愿意接受陈旧响应的时间长度
  • 重新验证和重新加载

    • must-revalidate: 一旦资源过期,缓存必须在使用前重新验证
    • proxy-revalidate: 与 must-revalidate 作用相同,但它仅适用于共享缓存(例如代理),并被私有缓存忽略
    • immutable: 若响应正文不随时间而改变,因此客户端不应发送重新验证请求头(例如 If-None-MatchIf-Modified-Since)来检查更新,即使用户显式地刷新页面
  • 其他

    • no-transform: 不得对资源进行转换或转变。Content-EncodingContent-RangeContent-Type 等不能由代理修改。例如,代理可能对图像格式进行转换,以便节省缓存空间减少流量
    • only-if-cached: 客户端只接受已缓存的响应,并且不要向原始服务器检查是否有更新的拷贝

指令格式具有以下有效规则:

  • 不区分大小写,但建议使用小写
  • 多个指令以逗号分隔
  • 具有可选参数,可以用令牌或者带引号的字符串语法
禁止缓存
Cache-Control: no-store
缓存静态资源
Cache-Control: public, max-age=31536000
需要重新验证
Cache-Control: no-cache
// 或
Cache-Control: max-age=0, must-revalidate

Expires

Expires 标头指定资源的过期时间,使用绝对时间(GMT 格式)。在指定时间后,资源被视为过期,需要重新获取。

Expires: Wed, 21 Oct 2023 07:28:00 GMT

如果同时存在 Cache-ControlExpiresCache-Control 的指令会覆盖 Expires

ETag

ETag 是一个唯一标识符(通常是资源的哈希值),用于标识资源的特定版本。

当对带有 ETag 响应的地址再次请求时,请求会自动带上上次得到的 ETag 值放在 If-None-Match 字段中, 服务器将客户端的 If-None-Match 值与当前版本资源的 ETag 进行比较,如果两个值匹配(即资源未更改),服务器将返回不带任何内容的 304 Not Modified 状态,从而节省带宽。

ETag: f683d0ed72ac1b6cd65be12ecea21ffd

Last-Modified

Last-Modified 标头指示资源的最后修改时间,由于精确度比 ETag 要低,所以这是一个备用机制。

值在再次请求时放在 If-Modified-Since 中的。当与 If-None-Match 一同出现时,它会被忽略掉,除非服务器不支持 If-None-Match

Last-Modified: Mon, 12 Aug 2024 09:23:20 GMT

Vary

Vary 标头用于告诉缓存服务器(如代理服务器)在缓存时要考虑哪些请求头。常见的值包括 Accept-EncodingUser-Agent 等。

Vary: Accept-Encoding, User-Agent