如果无缓存(no-cache)指令没有指定字段名,则缓存不能使用该响应来满足后续请求,而无需与原始服务器重新验证成功。这允许源服务器甚至通过配置成向客户端请求返回过期响应的缓存来防止缓存。
如果非缓存指令确实指定了一个或多个字段名,则缓存可以使用响应来满足后续请求,但受缓存上的任何其他限制。但是,在没有与原始服务器成功重新验证的情况下,在响应后续请求时,必须不发送指定的字段名。这允许源服务器防止在响应中重用某些头部字段,同时仍然允许缓存响应的其余部分。
注意:大部分HTTP/1.0协议下的缓存无法识别或遵守该指令
14.9.2 What May be Stored by Cachesno-store
no-store指令存在的目的是阻止那些无意间发布或保留的敏感信息(例如,备份信息)。no-store指令为整个消息提供实用,可能会被响应或请求发送。如果在请求中发送,缓存一定不能被请求的任何部分或响应该请求的响应存储。如果在响应中发送,则缓存不能存储该响应的任何部分或引发该请求的请求。该指令也适用于非共享和共享缓存。“必须不存储”在此上下文中意味着缓存必须不故意将信息存储在非易失性存储器中,并且必须尽力在转发信息之后尽可能迅速地从易失性存储器中删除信息。
即使这个指令与响应相关联,用户也可以在缓存系统之外显式地存储这样的响应(例如,使用“另存为”对话框)。历史缓冲区可以存储这些响应作为正常操作的一部分。
本指令的目的是满足某些用户和服务作者的既定要求,这些用户和服务作者担心通过意外访问缓存数据结构而泄漏信息。虽然在某些情况下,使用本指令可能改善一些隐私的保密性,但我们警告说,它绝不是确保隐私的可靠或充分的机制。特别地,恶意或受损的缓存可能无法识别或遵从这个指令,并且在这种情况下,通信网络可能很容易被窃听。
14.9.3 Modifications of the Basic Expiration Mechanism源服务器可以使用Expires头字段指定实体的过期时间(参见14.21节)。或者,可以在响应中使用max-age指令指定它。当缓存的响应中出现max-age cache-control指令时,如果当前时间大于对该资源的新请求时给出的时间值(以秒为单位),则响应就失效了。响应的max-age指令意味着响应是可缓存的(即,“public”)除非有其他更严格的缓存指令。
如果一个响应同时包含一个Expires头字段和一个max-age指令,则max-age指令将覆盖Expires头字段,即使Expires头字段有更多的限制。该规则允许源服务器为给定的响应提供比HTTP/1.0缓存更长(或更高)的HTTP/1.1缓存过期时间。如果某些HTTP/1.0缓存无法正确地计算时间或过期时间,这可能是有用的,导致该情况的原因可能是由于时钟不同步。
许多HTTP/1.0缓存实现会将一个小于或等于响应日期值的Expires值视为等同于cache - control的“no-cache”响应指令。如果HTTP/1.1缓存接收到这样的响应,并且响应不包含cache - control头字段,则应该认为响应不可缓存,以保持与HTTP/1.0服务器的兼容性。
注意:源服务器可能希望在网络上使用相对较新的HTTP缓存控制特性,比如“private”指令,其中包括不理解该特性的旧缓存。原始服务器需要将新特性与一个Expires字段合并,该字段的值小于或等于日期值。这将防止旧的缓存不正确地缓存响应。
s-maxage
如果响应包含一个s-maxage指令,那么对于共享缓存(但不是私有缓存),该指令指定的最大使用时限将覆盖由max-age指令或Expires头指定的最大使用时限。s-maxage指令还包含代理重新验证指令的语义(参见节),即,在实体过期后,缓存在原始服务器没有重新验证它之前必须不能使用该实体来响应后续请求。私有缓存总是忽略s-maxage指令。
注意,大多数旧的缓存行为,不遵循这个规范,无法实现任何缓存控制指令。如果源服务器希望使用该限制规范但又不防止HTTP/1.1兼容缓存的cache-control指令,那么它可能会利用max-age指令覆盖Expires头字段的要求,以及HTTP/1.1之前的版本兼容的缓存不遵守max-age指令的事实。
其他指令允许用户代理修改基本的过期机制。这些指示可按要求指定:
max-age
指示客户端愿意接受时限不大于指定时间(以秒为单位)的响应。除非还包含了旧的指令,否则客户端不希望接受旧的响应。
min-fresh