因为缓存可能忽略服务器配置的指定过期时间,因为客户端请求可能包括max-stale指令(也有类似的效果),该协议还包括一个源服务器的机制需要重新验证缓存条目的任何后续使用。当必须重新验证指令出现在缓存接收到的响应中时,该缓存必须在条目过期后使用该条目来响应后续请求,而不优先使用原始服务器重新验证该条目。(即。如果仅基于原始服务器的Expires或max-age值,缓存的响应就过时了,那么每次缓存都必须执行端到端重新验证。)
must-revalidate指令对于支持某些协议特性的可靠操作是必要的。在任何情况下,HTTP/1.1缓存必须遵守“must-revalidate”指令;特别是,如果缓存由于任何原因无法到达原始服务器,它必须生成504(网关超时)响应。
服务器应该发送“must-revalidate”指令,当且仅当在实体上重新验证请求失败可能导致错误操作(如未执行的财务事务)时才发送该指令。接收方不得采取任何违反此指令的自动操作,也不得在重新验证失败时自动提供实体的未验证副本。
尽管不建议这样做,但是在严格的连接约束下操作的用户代理可能违反此指令,但如果是这样,则必须明确警告用户已经提供了未经验证的响应。每个未经验证的访问都必须提供警告,并且需要明确的用户确认。
proxy-revalidate(代理重新验证)
proxy-reavalidate指令的含义与must-revalidate指令相同,只是它不适用于非共享的用户代理缓存。提供每次重新验证的服务(为了确保每个用户已经通过身份验证)。
它可以使用在回应一个身份验证请求,允许用户的缓存来存储和后来返回响应,而不需要重新验证(因为它已经被该用户身份验证一次),同时还要求代理服务许多用户重新验证每一次(为了确保每个用户已经通过身份验证)。注意,这种经过身份验证的响应还需要“public”缓存控制指令,以便能够完全缓存它们。
14.9.5 No-Transform Directiveno-transform
中间缓存(代理)的实现者发现转换某些实体的媒体类型是有用的。例如,非透明代理可以在图像格式之间进行转换,以便节省缓存空间或减少慢速链路上的通信量。
然而,当这些转换应用于特定类型的应用程序实体时,会出现严重的操作问题。例如,用于医学成像、科学数据分析以及使用端到端认证的应用都依赖于接收与原始实体-主体逐位相同(bit for bit identical——也就是每一字节都与原实体一样)的实体主体。
因此,如果消息包括no-transform指令,则中间缓存或代理必须不改变那些在第节中列出的、受no-transform指令制约的报头。这意味着缓存或代理必须不改变由这些头字段指定的实体主体的任何方面,包括实体主体本身的值。
14.9.6 Cache Control Extensions可以通过使用一个或多个缓存扩展令牌来扩展Cache-Control头字段,每个令牌具有可选的分配值。可以在不改变其他指令的语义的情况下添加信息扩展(不需要改变缓存行为的扩展)。行为扩展被设计为通过对缓存指令的现有基础作为修饰符来工作。提供新的指令和标准指令,使得不理解新指令的应用程序将默认执行标准指令指定的行为,而理解新指令的应用程序将认识到它修改了与标准指令相关的需求。这样,可以在不修改基础协议的情况下,对缓存控制指令进行扩展。
这种扩展机制依赖于HTTP缓存,它遵守为其原生HTTP版本定义的所有缓存控制指令,遵守某些扩展,并忽略它不理解的所有指令。
例如,假设有一个名为community的新响应指令,它充当私有指令的修饰符。我们定义这个新指令是为了表示,除了任何非共享缓存之外,任何仅由值中指定的社区成员共享的缓存都可以缓存响应。希望允许UCI社区在其共享缓存中使用私有响应的源服务器可以通过包括下面的字段来实现这一点
Cache-Control: private, community="UCI"
即使缓存不理解community cache-extension,看到这个header字段的缓存也会正常工作,因为它也会看到并理解私有指令,因此默认为安全行为。
不能识别的缓存指令必须被忽略;假设任何缓存指令可能无法被HTTP/1.1缓存识别,将与标准指令结合使用(或者响应的默认缓存能力,即使缓存不理解扩展,缓存行为也将保持最低限度的正确性)。
14.10 ConnectionConnection通用头字段允许发送方指定特定链接所需的选项,并且代理不能通过其他链接进行通信。
Connection头字段的语法如下:
Connection = "Connection" ":" 1#(connection-token)
connection-token = token
在Connection字段中列出的Message头字段不能包含端到端类型的头字段,比如Cache-Control。
HTTP/1.1为发送方定义了“close”连接选项,以表示连接将在响应完成后关闭。比如:
Connection: close
无论在响应还是请求中都表示在响应或请求完成后,该链接不能被当作持久链接。
不支持持久链接的HTTP/1.1应用程序必须在每一个消息(message)中包含close链接选项。