表示客户端愿意接受新鲜度时限不小于当前时间加上指定时间(以秒为单位)的响应。也就是说,客户端希望响应至少在指定的秒数内仍然是有效的。
max-stale
指示客户端愿意接受超过过期时间的响应。如果赋给max-stale值,那么客户端愿意接受超过其过期时间不超过指定秒数的响应。如果没有赋值给max-stale赋值,那么客户愿意接受任何时限的陈旧响应。
如果缓存返回陈旧的响应,或者因为请求上的max-stale指令,或者因为缓存被配置为覆盖响应的过期时间,那么缓存必须使用警告110(响应过时了)并将警告标头附加到过时的响应上。
缓存可以配置为在不进行验证的情况下返回过时的响应,但前提是这与缓存验证的任何“必须”级别需求(例如,“必须重新验证”cache-control指令)不冲突。
如果新请求和缓存内容都包含“max-age”指令,那么两个值中的较小值将用于确定该请求缓存内容的新鲜度。
14.9.4 Cache Revalidation and Reload Controls有时候,用户代理可能希望或需要坚持让缓存使用原始服务器重新验证其缓存条目(而不仅仅是使用沿着原始服务器路径的下一个缓存),或者从原始服务器重新加载其缓存条目。如果缓存或原始服务器高估了缓存响应的过期时间,那么端到端重新验证可能是必要的。如果缓存条目由于某种原因损坏,那么端到端的重新加载可能是必要的。
端到端重新验证可以在客户端没有自己的本地缓存副本时请求,在这种情况下,我们将其称为“未指定的端到端重新验证”,或者当客户端有本地缓存副本时,在这种情况下,我们将其称为“特定的端到端重新验证”。
客户端可以使用Cache-Control请求指令指定这三种操作:
End-to-end reload(端到端重新加载)
这个请求包括一个“无缓存(no-cache)”cache-control指令,或者为了与HTTP/1.0客户端兼容,使用“Pragma: no-cache”。在请求中,字段名不能包含在无缓存指令中。服务器在响应此类请求时不能使用缓存副本。
Specific end-to-end revalidation(特定的端到端重新生效)
该请求包括一个“max-age=0”cache-control指令,该指令强制沿着到原始服务器的路径中的每个缓存与下一个缓存或服务器一起重新验证自己的条目(如果有的话)。最初的请求包括一个缓存验证条件和客户端的当前验证器。
Unspecified end-to-end revalidation(未指定的端到端再校验)
该请求包括“max-age=0”缓存控制指令,该指令强制沿着到源服务器的路径的每个缓存使用下一个缓存或服务器重新验证其自己的条目(如果有的话)。初始请求不包括缓存验证条件,沿着保存该资源的缓存条目的路径(如果有的话)的具有其当前验证器的缓存验证条件的第一个缓存。
max-age
当通过max-age=0指令强制中间缓存重新验证其自己的缓存条目,并且客户端在请求中提供了自己的验证器时,所提供的验证器可能与当前存储在缓存条目中的验证器不同。在这种情况下,缓存可以使用验证器来进行自己的请求,而不影响语义透明性。
但是,验证器的选择可能会影响性能。最好的方法是中间缓存使用它自己的验证器来进行请求。如果服务器用304(Not Modified.)进行响应,则缓存可以向客户端返回其现在已验证的副本,并带有200(OK)响应。但是,如果服务器用新的实体和缓存验证器进行响应,则中间缓存可以使用强比较函数将返回的验证器与客户端请求中提供的验证器进行比较。如果客户端的验证器等于源服务器,则中间缓存只返回304(Not Modified.)。否则,它返回具有200(OK)响应的新实体。
如果请求包含no-cache指令,则不应包括min-fresh、max-stale或max-age。
only-if-cached
在某些情况下,比如网络连接性非常差的时候,客户端可能希望缓存只返回它当前存储的响应,而不是使用原始服务器重新加载或重新验证。要做到这一点,客户端可以在请求中包含noly-if-cached指令。如果它接收到这个指令,缓存应该使用与请求的其他约束一致的缓存条目进行响应,或者使用504(网关超时-Gateway Timeout)状态进行响应。但是,如果一组缓存作为一个统一的系统进行操作,并且具有良好的内部连接,则该请求可以在该组缓存中转发。
must-revalidate(必须重新验证)