5.2.2 响应 Cache-Control 指令 (Response Cache-Control Directives)
本节定义源服务器或中介可以在 HTTP 响应中使用的缓存指令。
5.2.2.1. must-revalidate
"must-revalidate" 响应指令表示,一旦响应变得过期,缓存不得在源服务器上成功验证的情况下使用该响应来满足后续请求。
must-revalidate 指令对于支持某些协议功能的可靠运行是必要的。在所有情况下,缓存必须遵守 must-revalidate 指令;特别是,如果缓存因任何原因无法到达源服务器,它必须生成 504(Gateway Timeout)响应。
当且仅当验证请求失败可能导致不正确的操作(例如静默未执行的金融交易)时,服务器才应该使用 must-revalidate 指令。
5.2.2.2. no-cache
参数: #field-name(可选)
"no-cache" 响应指令表示,响应不得在源服务器上成功验证的情况下用于满足后续请求。这允许源服务器阻止缓存在不联系它的情况下使用响应来满足请求,即使缓存已配置为发送过期响应。
如果 no-cache 响应指令指定一个或多个字段名称,则缓存可以在满足其他缓存限制的前提下,使用该响应来满足后续请求。但是,在未与源服务器成功重新验证的情况下,指定的任何字段名称不得被发送到后续请求的响应中。这允许源服务器阻止响应中某些头字段被重用,同时仍允许缓存响应的其余部分。
注意:大多数 HTTP/1.0 缓存不会识别或遵守此指令。此外,带有字段名称的 no-cache 响应指令通常被实现当作收到了未限定的 no-cache 指令来处理;也就是说,对限定形式的特殊处理并未被广泛实现。
5.2.2.3. no-store
"no-store" 响应指令表示缓存不得存储即时请求或响应的任何部分。该指令同时适用于私有缓存和共享缓存。在此上下文中,"不得存储"意味着缓存不得有意将信息存储在非易失性存储中,并且必须在转发后尽快尽最大努力从易失性存储中移除该信息。
该指令不是确保隐私的可靠或充分机制。特别是,恶意或已受损的缓存可能不识别或不遵守该指令,并且通信网络可能容易受到窃听。
5.2.2.4. no-transform
"no-transform" 响应指令表示中介(无论是否实现缓存)不得转换有效负载,如 [RFC7230] 的第 5.7.2 节所定义。
5.2.2.5. public
"public" 响应指令表示任何缓存都可以存储响应,即使该响应通常不可缓存,或者通常只可在私有缓存内缓存。(另见第 3.2 节,其中讨论了 Authorization 头字段对可缓存性的影响。)
5.2.2.6. private
参数: #field-name(可选)
"private" 响应指令表示响应旨在供单个用户使用,并且不得被共享缓存存储。私有缓存可以存储该响应并将其重用于后续请求,即使该响应通常不可缓存。
如果 private 响应指令指定一个或多个字段名称,该要求仅限于与所列响应头字段关联的字段值。也就是说,共享缓存不得存储指定的字段名称,但可以存储响应消息的其余部分。
注意:该指令不是确保隐私的可靠或充分机制。特别是,恶意或已受损的缓存可能不识别或不遵守该指令,并且通信网络可能容易受到窃听。
5.2.2.7. proxy-revalidate
"proxy-revalidate" 响应指令与 must-revalidate 响应指令具有相同含义,但不适用于私有缓存。
5.2.2.8. max-age
参数: delta-seconds
"max-age" 响应指令表示当响应的年龄大于指定秒数后,该响应应被视为过期。
该指令使用参数语法的标记形式:例如 max-age=5,而不是 max-age="5"。发送方不应该生成引用字符串形式。
5.2.2.9. s-maxage
参数: delta-seconds
"s-maxage" 响应指令表示,在共享缓存中,该指令指定的最大年龄会覆盖由 max-age 指令或 Expires 头字段指定的最大年龄。s-maxage 指令还隐含 proxy-revalidate 响应指令的语义。
该指令使用参数语法的标记形式:例如 s-maxage=10,而不是 s-maxage="10"。发送方不应该生成引用字符串形式。