2.如果响应中包含“must-revalidate”缓存控制指令( cache-control directive),缓存可以在答复后续请求时使用该响应。但是,如果响应已经过期,所有缓存必须首先用源服务器重新验证它,使用来自新请求的请求头来允许源服务器验证新请求。
3.如果响应包含“public”缓存控制指令,则可以回复任何后续请求。
14.9 Cache-ControlCache-Control通用头字段用于指定在请求/响应链上所有的缓存都必须遵守的规则。指令的指定旨在防止缓存对请求或响应产生不利干扰的一些行为。这些指令通常会重写默认缓存算法。缓存指令是单项的,请求中存在指令并不意味着响应中也将会给出相同的指令。
注意:HTTP/1.0协议版本下的缓存可能无法实现缓存控制,只能实现Pragma(编译指示): no-cache (详情请见 小节).
缓存指令必须由代理或网关应用程序传递,无论这些指令对该程序是否有用,因为这些指令可能适用于请求/响应链上的所有接收者。我们不可能为特定的缓存指定缓存指令。
Cache-Control = "Cache-Control" ":" 1#cache-directive
cache-directive = cache-request-directive | cache-response-directive
cache-request-directive =
"no-cache" ; Section
| "no-store" ; Section
| "max-age" "=" delta-seconds ; Section ,
| "max-stale" [ "=" delta-seconds ] ; Section
| "min-fresh" "=" delta-seconds ; Section
| "no-transform" ; Section
| "only-if-cached" ; Section
| cache-extension ; Section
cache-response-directive =
"public" ; Section
| "private" [ "=" <"> 1#field-name <"> ] ; Section
| "no-cache" [ "=" <"> 1#field-name <"> ]; Section
| "no-store" ; Section
| "no-transform" ; Section
| "must-revalidate" ; Section
| "proxy-revalidate" ; Section
| "max-age" "=" delta-seconds ; Section
| "s-maxage" "=" delta-seconds ; Section
| cache-extension ; Section
cache-extension = token [ "=" ( token | quoted-string ) ]
当指令没有任何一个字段名参数出现时,该指令适用于整个请求或响应。当这样的指令以符合要求的字段名参数出现时,它只适用于命名字段,而不适用于请求或响应的其余部分。该机制支持可扩展性;HTTP协议的未来版本的实现可能将这些指令应用于HTTP/1.1中未定义的头字段。
缓存控制指令可以分解为以下这些一般类别。
-限制什么是可缓存的;这些只能由源服务器强加。
-对缓存可以存储的内容的限制;这些可以由源服务器或用户代理强制执行。
-基本过期机制的修改;这些可以由源服务器或用户代理强制执行。
-对缓存重新验证和重新加载进行控制;这些可能仅由用户代理强制执行。
-控制实体的转换。
-缓存系统的扩展。
14.9.1 What is Cacheable默认情况下,如果请求方法、请求头字段和响应状态的指示该响应是可缓存的,则响应是可缓存的。第小节总结了这些可缓存性的默认值。下面的Cache-Control响应指令允许源服务器重写响应的默认缓存性:
public
指示响应可能由任何缓存来缓存资源,即使它通常不可缓存或仅在非共享缓存中缓存。(请参阅授权,第小节,以了解更多细节。)
private
指示响应消息的全部或部分用于单个用户,而不能由共享缓存缓存。这允许源服务器声明响应的指定部分仅针对一个用户,而不能对其他用户的请求进行有效响应。私有(非共享)缓存可以缓存响应。
注意: private一词的在这里的语义只是控制响应可以缓存在哪里,并不能确保消息内容的隐私性。
no-cache