在 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
等。