在 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-Match或If-Modified-Since)来检查更新,即使用户显式地刷新页面
-
其他
no-transform: 不得对资源进行转换或转变。Content-Encoding、Content-Range、Content-Type等不能由代理修改。例如,代理可能对图像格式进行转换,以便节省缓存空间减少流量only-if-cached: 客户端只接受已缓存的响应,并且不要向原始服务器检查是否有更新的拷贝
指令格式具有以下有效规则:
- 不区分大小写,但建议使用小写
- 多个指令以逗号分隔
- 具有可选参数,可以用令牌或者带引号的字符串语法
Expires
Expires 标头指定资源的过期时间,使用绝对时间(GMT 格式)。在指定时间后,资源被视为过期,需要重新获取。
如果同时存在 Cache-Control 和 Expires,Cache-Control 的指令会覆盖 Expires
ETag
ETag 是一个唯一标识符(通常是资源的哈希值),用于标识资源的特定版本。
当对带有 ETag 响应的地址再次请求时,请求会自动带上上次得到的 ETag 值放在 If-None-Match 字段中, 服务器将客户端的 If-None-Match 值与当前版本资源的 ETag 进行比较,如果两个值匹配(即资源未更改),服务器将返回不带任何内容的 304 Not Modified 状态,从而节省带宽。
Last-Modified
Last-Modified 标头指示资源的最后修改时间,由于精确度比 ETag 要低,所以这是一个备用机制。
值在再次请求时放在 If-Modified-Since 中的。当与 If-None-Match 一同出现时,它会被忽略掉,除非服务器不支持 If-None-Match。
Vary
Vary 标头用于告诉缓存服务器(如代理服务器)在缓存时要考虑哪些请求头。常见的值包括 Accept-Encoding、User-Agent 等。