副本请求9111 HTTP缓存 2022年6月
Fielding等人。 标准跟踪 [页码]
流:
互联网工程任务组(IETF)
副本请求:
9111
标准:
98
过时:
7234
类别:
标准跟踪
出版:
国际标准编号:
2070-1721
作者:
R.菲尔丁,预计起飞时间。
土砖
诺丁汉M,预计起飞时间。
快速地
J.Reschke,预计起飞时间。
绿色字节

副本请求9111

HTTP缓存

摘要

超文本传输协议(HTTP)是一种无状态应用程序级协议分布式、协作、超文本信息系统的协议。本文档定义了HTTP缓存和相关联的头字段控制缓存行为或指示可缓存的响应消息。

本文件废除了RFC 7234。

关于下段备忘

这是一个互联网标准跟踪文档。

本文件是互联网工程任务组的产品(IETF)。它代表了IETF社区的共识。它有已接受公众审查,并已批准出版互联网工程指导小组(IESG)。进一步有关互联网标准的信息,请参见RFC 7841。

有关此文档当前状态的信息,任何勘误表,以及如何提供有关它的反馈,请访问https://www.rfc-editor.org/info/rfc9111.

目录

1引言

超文本传输协议(HTTP)是一种无状态应用程序级协议使用可扩展语义和用于与基于网络的灵活交互的自描述性消息超文本信息系统。它通常用于分布式信息系统,其中使用响应缓存可以提高性能。本文件定义与缓存和重用响应相关的HTTP方面信息。

HTTP“缓存”是响应消息的本地存储控制其中消息的存储、检索和删除的子系统。缓存存储可缓存的响应,以减少响应时间和未来等效请求的网络带宽消耗。任何客户或服务器5月使用缓存,但当用作隧道时不使用缓存(第3.7节第页,共页[超文本传输协议]).

“共享缓存”是存储响应以供重用的缓存多个用户;通常(但不总是)部署共享缓存作为中间人的一部分。相比之下,“私有缓存”,专用于单个用户;通常,它们被部署为用户代理。

HTTP缓存的目标是显著提高性能通过重用先前的响应消息来满足当前请求。缓存将存储的响应视为“新的”,如第4.2节,如果可以重复使用“验证”(与源服务器进行检查,以查看缓存的响应对于此请求仍然有效)。因此,新的回应可以每次缓存重用时,都会减少延迟和网络开销。当缓存的响应不新鲜时,如果进行验证,它可能仍然可以重用可以提神(第4.3节)或者如果原点不可用(第4.2.4节).

本文件作废副本请求7234,变化总结如下附录B.

1.1.需求符号

关键词“必须", "不能","必需的", "", "不得", "应该", "不应该","推荐", "不推荐","5月“、和”可选的“在本文档中按BCP 14中所述进行解释[RFC2119协议] [RFC8174号文件]当且仅当它们出现在所有首都时,如图所示。

第2节第页,共页[超文本传输协议]定义一致性标准并包含有关错误处理的注意事项。

1.2.语法符号

本规范使用增广Backus-Naur形式(ABNF)表示法[RFC5234号文件],扩展了区分大小写的符号在中定义的字符串中[RFC7405协议].

它还使用在中定义的列表扩展名第5.6.1节第页,共页[超文本传输协议],允许使用“#”对逗号分隔的列表进行紧凑定义操作符(类似于“*”操作符指示重复的方式)。附录A用所有列表显示收集的语法运算符扩展为标准ABNF表示法。

1.2.1.导入的规则

以下核心规则包含在参考,定义见[RFC5234号文件],附录B.1:数字(十进制0-9)。

[超文本传输协议]定义以下规则:

HTTP日期=<HTTP日期,请参阅[HTTP],第5.6.7节>OWS=参见[HTTP]第5.6.3节>field-name=参见[HTTP]第5.1节>quoted-string=参见[HTTP]第5.6.4节>token=<令牌,参见[HTTP]第5.6.2节>

1.2.2.增量秒数

delta秒规则指定一个非负整数,表示时间以秒为单位。

增量秒=1*DIGIT

收件人解析增量秒值并将其转换为二进制形式应使用至少31位非负整数的算术类型范围。如果缓存收到大于最大整数的增量秒值它可以表示,或者如果其任何后续计算溢出,缓存必须将该值视为2147483648(231)或它可以方便地使用的最大正整数代表。

2缓存操作概述

正确的缓存操作保留了HTTP传输的语义同时减少已保存在隐藏物。请参见第3节第页,共页[超文本传输协议]了解HTTP的一般术语和核心概念。

尽管缓存完全是可选的HTTP的功能,可以是假设重用缓存的响应是可取的,并且这种重用是无要求或本地配置时的默认行为因此,重点关注HTTP缓存需求防止缓存存储不可重用的响应或不恰当地重用存储的响应,而不是强制这样做缓存总是存储和重用特定的响应。

“缓存密钥”是缓存用于选择响应和至少由请求方法和目标组成用于检索存储的响应的URI;该方法确定在哪种情况下响应可用于满足后续请求的情况。然而,许多目前常用的HTTP缓存仅缓存GET响应,因此仅使用URI作为缓存密钥。

缓存可能存储请求目标的多个响应以内容协商为准。缓存区分这些响应通过合并一些原始请求的头字段使用Vary中的信息响应标题字段,根据第4.1节.

缓存可能会将其他材质合并到缓存密钥中。例如用户代理缓存可能包括引用站点的标识,从而“双重键入”缓存以避免一些隐私风险(请参见第7.2节).

最常见的是,缓存存储检索成功的结果请求:即对GET请求的200(OK)响应包含目标资源的表示(第9.3.1节第页,共页[超文本传输协议])。但是,也可以存储重定向,负面结果(例如,404(找不到)),不完整的结果(例如206(部分内容)),以及对GET以外的方法的响应,如果方法的定义允许这样缓存并定义适合用作缓存密钥的内容。

当缓存无法联系源时,它将“断开连接”服务器或以其他方式查找请求的转发路径。A类在某些情况下,断开连接的缓存可能会提供过时的响应(第4.2.4节).

三。在缓存中存储响应

缓存不能存储对请求的响应,除非:

请注意,缓存扩展可以覆盖任何要求上市的;看见第5.2.3节.

在这种情况下,缓存“理解”了请求方法或响应状态代码,如果它识别它并实现所有指定的与大笑相关的行为。

请注意,在正常操作中,某些缓存不会存储既没有缓存验证器,也没有明确的过期时间响应通常不适合存储。然而,缓存不是禁止存储此类响应。

3.1.存储页眉和尾部字段

缓存必须包括所有接收到的响应头字段--包括无法识别的响应——存储响应时;这确保了新的HTTP头字段可以成功部署。然而,以下例外情况制造:

缓存5月将尾部字段与标题字段分开存储,或丢弃它们。缓存不能将尾部字段与标题字段合并。

3.2.更新存储的标题字段

需要缓存才能从另一个(通常较新)几种情况下的响应;例如,参见章节3.4,4.3.4、和4.3.5.

执行此操作时,缓存必须在提供的响应中添加每个标题字段替换已经存在的字段值,但以下情况除外:

  • 中存储的标题字段除外第3.1节,
  • 缓存存储响应所依赖的标头字段,如下所述,
  • 收件人自动处理和删除的标题字段,如下所述,以及
  • Content-Length标题字段。

在某些情况下,缓存(尤其是在用户代理中)存储处理接收到的响应,而不是响应本身,并且更新影响该处理的标题字段可能会导致不一致的行为和安全问题。这种情况下的缓存5月在更新例外基础,但应该将这种省略限制在那些字段中确保存储响应的完整性所必需的。

例如,浏览器可以解码响应的内容编码当它被接收时,在它拥有的数据之间创建一个断开连接存储和响应的原始元数据。使用不同的内容编码更新存储的元数据标题字段会有问题。同样,浏览器可能会存储后解析HTML树,而不是中接收的内容回应;更新Content-Type标题字段不可行在这种情况下,因为在解析过程中对格式所做的任何假设都会现在无效。

此外,一些字段由HTTP实现,例如Content-Range头字段。启动位置5月自动从更新中省略此类标题字段,即使处理实际上没有发生。

请注意,Content-*前缀并不是省略标题字段的信号来自更新;这是MIME头字段的约定,而不是HTTP。

3.3.存储不完整的响应

如果请求方法为GET,则响应状态代码为200(OK),并且已收到整个响应标头部分隐藏物5月存储未完成的响应(第6.1节第页,共页[超文本传输协议])前提是存储的响应被记录为不完整。同样,206(部分内容)响应5月把它当作不完整的东西存放200(正常)响应。然而,缓存不能商店如果不支持Range和Content-Range标题字段或if它不理解这些字段中使用的范围单位。

缓存5月通过生成后续响应来完成存储的不完整响应范围请求(第14.2条第页,共页[超文本传输协议])并将成功的回应与存储的响应,如中所定义第3.4节.缓存不能使用不完整的响应来回答请求,除非响应已完成,或者请求是部分的并指定完全在不完全响应范围内。缓存不能向客户端发送部分响应,但不显式标记它使用206(部分内容)状态代码。

3.4。组合部分内容

如果连接过早关闭或请求使用了一个或多个Range说明符(第14.2条第页,共页[超文本传输协议]). 在多次这样的传输之后,缓存可能会收到了几个具有相同表示的范围。缓存5月结合这些范围转换为单个存储的响应,并将该响应重用到如果它们都共享同一个强验证器并且缓存符合中的客户端要求第15.3.7.3条第页,共页[超文本传输协议].

将新响应与一个或多个存储的响应组合时,缓存必须使用标头字段更新存储的响应标头字段在新的答复中提供,根据第3.2节.

3.5。存储对已验证请求的响应

共享缓存不能对请求使用缓存的响应授权标题字段(第11.6.2条第页,共页[超文本传输协议])至满足任何后续请求,除非响应包含控制缓存带有响应指令的字段(第5.2.2节)允许它存储在共享缓存,并且缓存符合针对该响应的指示。

在本规范中,以下响应指令具有这种效果:必须重新验证(第5.2.2.2节),公众(第5.2.2.9节)、和s-最大值(第5.2.2.10节).

4从缓存构造响应

当出现请求时,缓存不能重用存储的响应除非:

请注意,缓存扩展可以覆盖任何要求上市的;看见第5.2.3节.

当使用存储的响应来满足请求而不进行验证时隐藏物必须生成年龄标题字段(第5.1节),将响应中存在的任何值替换为等于存储的响应的current_age;看见第4.2.3节.

缓存必须使用不安全方法的直写请求(第9.2.1条第页,共页[超文本传输协议])到源服务器;即,不允许缓存在转发请求之前生成对此类请求的回复,并且收到相应的响应。

此外,请注意,不安全的请求可能会使已存储的响应无效;看见第4.4节.

缓存可以使用存储或可存储的响应来满足多个请求,前提是允许重用该响应针对相关请求。这使缓存能够“崩溃”请求“--或将多个传入请求合并为单个转发缓存未命中时请求--从而减少源服务器上的负载和网络。但是,请注意,如果缓存无法使用返回的响应部分或全部崩溃的请求,它需要转发请求以满足它们,可能会引入额外的延迟。

当存储多个合适的响应时,缓存必须使用最近的一个(由日期标题确定字段)。它还可以通过“Cache-Control:max-age=0”或“Cache-Control:no-Cache”消除使用哪个响应的歧义。

没有时钟的缓存(第5.6.7节第页,共页[超文本传输协议])必须重新验证存储每次使用时的响应。

4.1.使用可变标题字段计算缓存键

当缓存收到可由存储的响应满足的请求时存储的响应包含一个Vary头字段(第12.5.5条第页,共页[超文本传输协议]),缓存不能使用存储的响应而不重新验证,除非由该Vary字段值指定的所有呈现的请求标题字段匹配原始请求中的那些字段(即导致缓存响应被存储的请求)。

如果满足以下条件,则定义两个请求的头字段进行匹配只有当第一个请求中的那些可以转换为通过应用以下任何一种方法再次请求:

  • 添加或删除标题字段中允许的空白语法
  • 组合具有相同字段名的多个标题字段行(请参见第5.2节第页,共页[超文本传输协议])
  • 以已知的方式规范化两个标题字段值根据标题字段的规范,语义相同(例如,当顺序不重要时,重新排序字段值;大小写规范化,其中值定义为大小写敏感)

如果(在可能发生的任何规范化之后)缺少标题字段从一个请求中,它只能匹配另一个同样不存在的请求那里。

一个存储的响应,其Vary标头字段值包含成员“*”总是不匹配。

如果多个存储的响应匹配,缓存需要选择一个来使用。当指定的请求标题字段具有已知的排序机制时(例如,Accept和类似请求头上的qvalues字段),该机制5月用于选择首选答案。如果这种机制不可用,或导致同等优先响应,最新响应(由日期标题字段确定)为选择,作为第4节.

一些资源错误地从默认值中省略了Vary头字段响应(即,请求未表达任何偏好时发送的响应),其效果是为对该资源的后续请求选择它即使有更可取的回应。当缓存具有目标URI的多个存储响应,一个或多个忽略Vary头字段,缓存应该选择最近的(请参见第4.2.3节)使用有效Vary存储响应字段值。

如果没有存储的响应匹配,则缓存无法满足呈现的请求。通常,请求被转发到源服务器,可能添加了先决条件来描述缓存的响应已存储(第4.3节).

4.2.新鲜度

一个“新鲜”的反应是年龄还没有超过它的新鲜度寿命。相反,“陈腐”的反应就是这样。

回复的“新鲜寿命”是指时间长度从源服务器生成到过期时间之间。“显式过期时间”是源服务器打算缓存不再使用存储的响应无需进一步验证,而“启发式过期当没有明确的到期时间可用。

回复的“年龄”是指回复后经过的时间由源服务器生成或成功验证。

当回应新鲜时,它可以用来满足在不联系源服务器的情况下执行后续请求,从而改进效率。

确定新鲜度的主要机制是源服务器使用到期标题字段(第5.3节)或max-age响应指令(第5.2.2.1节)。通常,源服务器将为信念中的响应指定未来的明确过期时间表示在语义上不太可能改变在到达到期时间之前的重要方式。

如果源服务器希望强制缓存验证每个请求可以指定过去的显式过期时间,以指示响应已经过时。兼容缓存通常会验证过时的缓存响应,然后再将其用于后续请求(请参阅第4.2.4节).

由于源服务器并不总是提供明确的过期时间,缓存也可以使用启发式方法来确定过期时间在某些情况下(参见第4.2.2节).

确定响应是否新鲜的计算是:

response_is_fresh=(freshness_lifetime>current_age)

freshness_lifetime定义于第4.2.1节; current_age定义于第4.2.3节.

客户端可以发送max-age或min-fresh请求指令(第5.2.1节)建议限制新鲜度相应响应的计算。然而,缓存不是需要尊重他们。

计算新鲜度时,为了避免数据解析中的常见问题:

  • 尽管所有日期格式都指定为区分大小写,缓存收件人应该匹配字段值对案件敏感。
  • 如果缓存收件人的内部实现时间更少比HTTP-date的值更高的分辨率,接收方必须内部表示已解析的到期日期作为等于或早于接收值的最近时间。
  • 缓存收件人不能允许本地时区影响计算或比较年龄或到期时间。
  • 缓存收件人应该考虑使用区域缩写的日期除“GMT”之外的其他值对于计算过期时间无效。

注意,新鲜度仅适用于缓存操作;它不能用于强制用户代理刷新其显示或重新加载资源。请参见第6节解释一下缓存和历史机制。

4.2.1、。计算新鲜度寿命

缓存可以计算新鲜度生存期(表示为freshness_lifetime),通过评估以下规则并使用第一个匹配项:

  • 如果缓存是共享的,并且s-maxage响应指令(第5.2.2.10节)存在,使用其值,
  • 如果max-age响应指令(第5.2.2.1节)存在,使用其值,或
  • 如果到期响应标头字段(第5.3节)存在时,使用其值减去Date response头字段的值(如果消息不存在,则使用接收消息的时间,根据第6.6.1条第页,共页[超文本传输协议]),或
  • 否则,响应中不存在明确的到期时间。A类启发式新鲜度寿命可能适用;看见第4.2.2节.

请注意,此计算旨在通过使用源服务器尽可能提供的时钟信息。

当给定指令存在多个值时(例如,两个到期标题字段行或多个Cache-Control:max-age指令),则应使用第一次出现,或应使用响应被认为是陈腐的。如果指令冲突(例如。,max-age和no-cache都存在),最严格的指令应该我很荣幸。鼓励缓存考虑具有无效的新鲜度信息(例如,带有非整数内容的max-age指令)陈腐。

4.2.2.计算启发新鲜度

由于源服务器并不总是提供明确的过期时间隐藏物5月当显式时间不为指定,使用使用其他字段值的算法(例如最后修改的时间)来估计合理的到期时间时间。本规范没有提供具体的算法,但确实提供了对结果施加最坏的限制。

缓存不能当显式在存储的响应中存在过期时间。因为中的要求第3节,启发式只能用于没有显式的响应状态码定义为“启发式缓存”的新鲜度(例如,请参见第15.1条第页,共页[超文本传输协议])以及关于没有标记为显式可缓存的显式新鲜度(例如。,公共响应指令)。

注意,在前面的规范中,启发式缓存响应状态代码被称为“默认情况下可缓存”。

如果响应具有Last-Modified头字段(第8.8.2节第页,共页[超文本传输协议]),鼓励缓存使用启发式过期值,该值不超过自那一次。此分数的典型设置可能为10%。

4.2.3.计算年龄

这个年龄标题字段用于传递估计值从缓存中获取的响应消息的期限。年龄字段值是缓存对自源服务器生成以来的秒数的估计或验证响应。因此,“年龄”值为响应驻留在每个沿源服务器的路径缓存,加上时间已沿网络路径进行传输。

年龄计算使用以下数据:

“年龄值”
术语“age_value”表示年龄标题字段(第5.1节),形式适合算术运算;或0(如果不可用)。
“日期值”
术语“date_value”表示日期标题字段,采用适合算术的格式操作。请参见第6.6.1条第页,共页[超文本传输协议]用于定义Date标题字段和关于没有它的响应的要求。
“现在”
术语“现在”是指此实现的时钟的当前值(第5.6.7节第页,共页[超文本传输协议]).
“请求时间”
请求时的时钟值导致存储的响应。
“响应时间”
响应时的时钟值已收到。

可以用两种完全独立的方法计算响应的年龄:

  1. “apparentage”:响应时间减去日期值,如果实现的时钟与源服务器的时钟相当同步。如果结果为负数,结果被替换为零。
  2. “correctedagevalue”,如果响应中的所有缓存路径实现HTTP/1.1或更高版本。缓存必须解释此值相对于启动请求的时间,而不是已收到响应。
apparent_age=最大值(0,response_time-date_value);response_delay=响应时间-请求时间;corrected_age_value=年龄值+响应延迟;

更正的_age_value5月用作校正的初始值。可能不正确的非常旧的缓存实现的情况插入年龄存在,则可以计算corrected_initial_age更保守地说

corrected_initial_age=最大值(apparent_age,corrected_age_value);

然后可以通过添加自上次验证存储的响应以来的时间(以秒为单位)将源服务器更改为correctedinitialage。

resident_time=现在-响应时间;current_age=corrected_initial_age+resident_time;

4.2.4.服务陈旧的响应

“过时”响应是具有显式到期信息或允许计算启发式有效期,但根据中的计算第4.2节.

缓存不能如果被禁止,则生成过时的响应明确的协议内指令(例如,通过no-cache响应指令、必须重新验证响应指令或适用的s-maxage或代理重新验证响应指令;看见第5.2.2节).

缓存不能除非断开连接,否则将生成过时的响应或客户端或源服务器明确允许这样做(例如,通过中的max-stale请求指令第5.2.1节,扩展指令,例如定义于[RFC5861协议],或根据配置与银行外合同)。

4.3。验证

当缓存对请求的URI有一个或多个存储响应时,但不能为其中任何一种提供服务(例如,因为它们不新鲜,或者不能被选中;看见第4.1节),它可以使用条件请求机制(第13节第页,共页[超文本传输协议])在转发给的请求中让下一个入站服务器有机会选择一个有效的存储响应使用、更新过程中存储的元数据或替换使用新响应存储的响应。此过程称为“验证”或“重新验证”存储的响应。

4.3.1.发送验证请求

生成条件验证请求时,缓存以它试图满足的请求,或者--如果它正在启动独立的请求——使用存储的通过复制方法、目标URI和请求头字段来响应由Vary标题字段标识(第4.1节).

然后,它用一个或多个前置条件头字段更新该请求。这些包含来自已存储响应的验证器元数据,该响应具有相同的URI。通常,这将只包括存储的响应具有相同的缓存密钥,但允许缓存进行验证无法使用发送的请求头字段选择的响应(请参见第4.1节).

然后,收件人将前提条件标题字段与确定任何存储的响应是否等效于电流资源的表示。

其中一个验证器是Last-Modified中给出的时间戳标题字段(第8.8.2节第页,共页[超文本传输协议]),可用于用于响应验证的If-Modified-Since头字段,或在If-Unmodified-Since或If-Range标头中代表选择字段(即客户正在推荐具体到之前使用该时间戳获得的表示)。

另一个验证器是ETag中给定的实体标记字段(第8.8.3节第页,共页[超文本传输协议])。一个或多个实体标记,指示一个或更多存储的响应,可以在If-None-Match标头中使用用于响应验证的字段,或在If-Match或表示选择的If-Range标题字段(即。,客户专门指的是之前获得的一个或多个具有列出的实体标记的表示)。

生成条件验证请求时,缓存:

  • 必须发送相关实体标签(使用If-Match、If-None-Match或If-Range),如果实体标记在正在验证存储的响应。
  • 应该发送“上次修改”值(使用If-Modified-Since)如果请求不是针对子范围,正在验证单个存储的响应,并且该响应包含Last-Modified值。
  • 5月发送Last-Modified值(使用If-Unmodified-Since或If-Range),如果请求是针对子范围的,单个存储的响应验证,并且该响应仅包含Last-Modified值(不是实体标记)。

在大多数情况下,两个验证器都是在缓存验证请求中生成的,即使实体标记明显优越,也允许旧的中介不理解实体标记前提条件以进行适当响应的。

4.3.2.处理收到的验证请求

请求链中的每个客户端都可能有自己的缓存,因此这是常见的中间层的缓存接收来自其他(出站)缓存。同样,一些用户代理使用条件请求将数据传输限制为最近修改的表示或完成部分检索到的表示的传输。

如果缓存接收到可以通过重用存储的200(合格)或206(部分内容)响应,根据第4节,缓存应该评估任何适用的条件标头在该请求中收到的与存储响应中包含的相应验证器。

缓存不能计算条件标头字段应用于源服务器,发生在具有以下语义的请求中无法满足缓存的响应,或出现在具有目标资源的请求中它没有存储的响应;这样的前提条件很可能用于其他(入站)服务器。

缓存对条件请求的正确评估取决于接收到前置条件标头字段及其优先级。总之,If-Match和If-Unmodified-Since条件头字段不是适用于缓存,“如果无匹配”优先于If-修改自。请参见第13.2.2条第页,共页[超文本传输协议]对于先决条件优先级的完整规范。

包含If-None-Match头字段的请求(第13.1.2条第页,共页[超文本传输协议])表示客户希望缓存选择的存储响应(根据第4节).

如果不存在If None Match标头字段,则请求包含If-Modified-Since头字段(第13.1.3条第页,共页[超文本传输协议])指示客户端要验证按修改日期存储的一个或多个响应。

如果请求包含If-Modified-Since头字段并且Last-Modified头字段不在存储的响应,缓存应该使用存储的响应日期字段值(或者,如果不存在日期字段,则时间接收到存储的响应)来计算条件。

实现对范围请求的部分响应的缓存,如中所定义的第14.2条第页,共页[超文本传输协议],还需要评估收到的If-Range标题字段(第13.1.5条第页,共页[超文本传输协议])关于缓存的所选响应。

当缓存决定转发请求以重新验证其自己存储的对的响应包含实体标记的If-None-Match列表的请求,缓存5月将收到的列表与实体标记列表合并从其自己存储的响应集(新鲜或陈旧)发送两个列表作为替换“如果不匹配”标头转发请求中的字段值。如果存储的响应仅包含部分内容,则隐藏物不能除非请求是对于部分存储的响应将完全满足的范围。如果对转发请求的响应是304(未修改),ETag字段值为不在客户端列表中的实体标记,即缓存必须通过重用它的相应的存储响应,由304响应元数据更新(第4.3.4节).

4.3.3.处理验证响应

对条件请求的响应的缓存处理取决于状态代码:

  • 304(未修改)响应状态代码表示存储的响应可以被更新和重用;看见第4.3.4节.
  • 完整回复(即包含内容的回复)表示没有在条件请求中指定的存储响应中有合适。相反,缓存必须使用完整的响应满足要求。缓存5月存储如此完整的响应,受其约束(参见第3节).
  • 但是,如果缓存收到5xx(服务器错误)在尝试验证响应时,它可以将此响应转发给请求的客户端,或将其作为服务器未能响应。在后一种情况下,缓存可以发送之前存储的响应,受其限制(请参见第4.2.4节),或重试验证请求。

4.3.4.验证时刷新存储的响应

当缓存收到304(未修改)响应时,它需要识别适合用新信息更新的存储响应提供,然后执行此操作。

要更新的初始存储响应集是那些可以选择用于该请求,即满足第4节,除了最后一个要求新鲜、陈腐或只是验证。

然后,通过以下第一个匹配项进一步过滤存储的初始响应集:

  • 如果新响应包含一个或多个“强验证器”(请参阅第8.8.1节第页,共页[超文本传输协议]),然后每个强验证器标识要更新的选定表示。所有存储的初始集合中带有相同强验证器之一的响应将被标识为更新。如果没有一个初始集包含至少一个相同的强验证器,然后隐藏物不能使用新响应更新所有存储的响应。
  • 如果新响应不包含强验证器,但包含一个或多个“弱验证器”,以及验证器对应于初始集合存储的响应之一,然后是最多的识别出最近的匹配存储响应以进行更新。
  • 如果新响应不包括任何形式的验证器(例如其中客户端从生成If-Modified-Since请求Last-Modified响应头以外的源字段),并且在初始集合中只有一个存储的响应,并且该存储的响应还缺少验证器,然后识别存储的响应以进行更新。

对于标识的每个存储响应,缓存必须更新其标题字段与304中提供的标题字段(非修改)响应,根据第3.2节.

4.3.5.用头部刷新响应

对HEAD方法的响应与等效请求相同如果没有发送内容,则使用GET生成。此属性的HEAD响应可用于使缓存的GET无效或更新如果更有效的条件GET请求机制不是可用(由于存储的响应中没有验证器)或如果不希望传输内容,即使已更改。

当缓存对目标URI和收到200(OK)响应,缓存应该更新或使本可以选择的每个存储的GET响应无效对于该请求(请参见第4.1节).

对于可以选择的每个存储响应,如果存储的响应和HEAD响应对于任何接收到的验证器字段(ETag和Last-Modified)并且,如果HEAD响应具有Content-Length头字段,Content-Length的值与存储的响应,缓存应该如下所述更新存储的响应;否则,缓存应该将存储的响应视为过时。

如果缓存使用HEAD中提供的元数据更新存储的响应响应,缓存必须使用HEAD中提供的标题字段response以更新存储的响应(请参见第3.2节).

4.4。使存储的响应无效

因为不安全的请求方法(第9.2.1条第页,共页[超文本传输协议])例如PUT、POST或DELETE有可能更改源服务器上的状态,进行干预缓存需要使存储的响应失效,以使其内容保持最新。

缓存必须使目标URI无效(第7.1节第页,共页[超文本传输协议])当它收到非错误状态时响应的代码不安全的请求方法(包括安全性未知的方法)。

缓存5月当收到非错误状态时,使其他URI无效响应不安全请求方法的代码(包括安全性未知)。特别是位置和内容-位置响应标头字段(如果存在)是无效的候选字段;其他URI可能是通过本文档中未指定的机制发现。然而,缓存不能在这些条件下触发无效如果来源(第4.3.1节第页,共页[超文本传输协议])要失效的URI的不同于目标URI的(第7.1节第页,共页[超文本传输协议])。这有助于防止拒绝服务攻击。

“失效”意味着缓存将删除所有目标URI与给定URI匹配或标记它们的存储响应“无效”,需要在发送之前进行强制验证以响应随后的请求。

“无错误响应”是指带有2xx(成功)的响应或3xx(重定向)状态代码。

请注意,这并不保证所有适当的响应都是全局失效;状态更改请求只会导致无效它通过的缓存中的响应。

5字段定义

本节定义HTTP字段的语法和语义与缓存相关。

5.1.年龄

“年龄”响应标题字段表示发送方对自在源服务器。年龄值按照中的规定进行计算第4.2.3节.

年龄=增量秒

年龄字段值是一个非负整数,以秒为单位表示时间(请参见第1.2.2节).

尽管它被定义为单个标头字段,但缓存遇到带有基于列表的“年龄”字段值的消息应该使用字段值的第一个成员,丢弃后面的成员。

如果字段值(根据上文丢弃附加成员后)无效(例如,它包含非负整数以外的内容),缓存应该忽略字段。

存在Age标头字段意味着响应不是由源服务器为此请求生成或验证。然而,缺少“年龄”标题字段并不意味着联系了来源。

5.2.控制缓存

“Cache-Control”头字段用于列出缓存的指令沿着请求/响应链。缓存指令是单向的,在请求中存在指令并不意味着响应中存在或复制了相同的指令。

请参见第5.2.3节获取有关如何处理在别处定义的Cache-Control指令。

代理,无论它是否实现缓存,必须传递缓存指令通过转发的消息,无论其对该应用程序具有重要意义,因为指令可能适用发送给请求/响应链上的所有收件人。不可能将指令指向特定缓存。

缓存指令由标记标识,以区分大小写进行比较,并且有一个可选参数,可以同时使用token和quoted-string语法。对于下面定义的定义参数的指令,收件人应该接受这两种形式,即使生成需要特定的形式。

Cache-Control=#Cache-directive缓存指令=令牌[“=”(令牌/带引号的字符串)]

对于下面定义的缓存指令,未定义参数(也不允许)除非另有说明。

5.2.1.请求指令

本节定义缓存请求指令。它们是咨询性的;缓存5月实施它们,但不是必须的。

5.2.1.1.最大年龄

参数语法:

max-age请求指令指示客户端首选年龄小于或等于指定数量的响应秒。除非max-stale请求指令也存在,否则客户端不希望收到过时的响应。

此指令使用参数语法的标记形式:例如,'max-age=5'不是'max-aage=“5”'。发件人不能生成报价表。

5.2.1.2.最大陈旧

参数语法:

max-stale请求指令指示客户端将接受一个超过新鲜度的回复。如果值为则客户愿意接受超过其新鲜度寿命不超过指定的秒数。如果max-stale没有赋值,则客户端将接受任何年龄段的陈腐反应。

此指令使用参数语法的标记形式:例如,'max-stale=10'而不是'max-scale=“10”'。发件人不能生成报价表。

5.2.1.3。最小新鲜度

参数语法:

min-fresh请求指令指示客户端首选新鲜度寿命不小于当前年龄加上以秒为单位的指定时间。也就是说,客户需要一个响应至少在指定的秒数内保持新鲜。

此指令使用参数语法的标记形式:例如,'min-fresh=20'而不是'min-freh=“20”'。发件人不能生成报价表。

5.2.1.4.无缓存

no-cache请求指令指示客户端更喜欢如果不成功,则不会使用存储的响应来满足请求在源服务器上进行验证。

5.2.1.5.无存储

no-store请求指令指示缓存不能存储此请求或其响应的任何部分。此指令同时适用于私有缓存和共享缓存。“绝对不能存储”在这个上下文中意味着缓存不能故意将信息存储在非易失性存储器中,并必须制作一个尽最大努力从易失性存储器中删除信息转发后尽快发送。

该指令不是确保隐私。特别是,恶意或受损的缓存可能不会承认或遵守此指令,通信网络可能容易被窃听。

请注意,如果包含此指令的请求从缓存,no-store请求指令不适用于已经存储的响应。

5.2.1.6。不转换

no-transform请求指令指示客户端正在请求中介机构应避免转换内容,如中所定义第7.7节第页,共页[超文本传输协议].

5.2.1.7.仅限if-cached

only-if-cached请求指令指示仅客户端希望获得存储的响应。满足此请求的缓存指令应该收到后,用存储的响应与请求的其他约束一致,或504(网关超时)状态代码。

5.2.2.响应指令

本节定义缓存响应指令。缓存必须遵守本节中定义的Cache-Control指令。

5.2.2.1.最大年龄

参数语法:

max-age响应指令指示响应当其使用年限大于指定的秒。

此指令使用参数语法的标记形式:例如,'max-age=5'不是'max-aage=“5”'。发件人不能生成报价表。

5.2.2.2.必须重新验证

必须重新验证响应指令表明,一旦响应已过时,缓存不能重用该响应以满足另一个请求,直到源站成功验证它为止,如由定义第4.3节.

必须重新验证指令是支持可靠操作所必需的用于某些协议功能。在所有情况下,缓存不能忽视必须重新验证指令;特别是,如果缓存断开连接,缓存必须生成错误响应,而不是重用过时的响应。生成的状态代码应该为504(网关超时)除非其他错误状态代码更适用。

当且仅当如果验证请求失败可能导致不正确的操作,例如未执行的财务报表交易。

must-revalization指令还允许共享缓存重用对包含授权的请求的响应标题字段(第11.6.2条第页,共页[超文本传输协议]),根据上述重新验证要求(第3.5节).

5.2.2.3.必须理解

必须理解的响应指令将响应缓存限制为理解并符合其要求的缓存响应的状态代码。

包含必须理解指令的响应应该还包含no-store指令。当实现must-understand指令收到包含该指令的响应,缓存应该忽略no-store指令理解并实现状态代码的缓存需求。

5.2.2.4.无缓存

参数语法:

no-cache响应指令的非限定形式(没有参数),表示响应不能用于满足任何其他请求,而不转发它进行验证并接收成功应对;看见第4.3节.

这允许源服务器防止缓存使用在不联系请求的情况下满足请求的响应,即使是通过具有已配置为发送过时的响应。

no-cache响应指令的限定形式,其参数为列出一个或多个字段名,表示缓存5月使用响应以满足后续请求,受任何其他限制在缓存时,如果列出的标题字段被排除在后面的响应或后续响应已成功重新验证源服务器(更新或删除这些字段)。这允许源服务器阻止重用某些标头字段,同时仍然允许缓存响应。

给定的字段名称不限于标题集本规范定义的字段。字段名区分大小写。

此指令使用参数语法的quoted-string形式。发件人不应该生成令牌表单(即使没有出现引号单条目列表需要)。

5.2.2.5。无存储

no-store响应指令指示缓存不能商店即时请求或响应的任何部分,以及不能使用满足任何其他请求的响应。

此指令适用于私有缓存和共享缓存。“绝对不能存储”在这个上下文中意味着缓存不能故意储存非易失性存储器中的信息必须尽最大努力尝试尽快从易失性存储器中删除信息转发后可能。

该指令不是确保隐私。特别是,恶意或受损的缓存可能不会承认或遵守此指令,通信网络可能容易被窃听。

请注意,must-understand cache指令覆盖了某些情况;看见第5.2.2.3节.

5.2.2.6.不转换

no-transform响应指令指示中介(无论它是否实现缓存)不能转换内容,如中所定义第7.7节第页,共页[超文本传输协议].

5.2.2.7.私有的

参数语法:

非限定私有响应指令表明共享缓存不能存储响应(即,响应是用于单个用户)。它还指示专用缓存5月存储响应、主题到中定义的约束第3节,即使否则响应将无法被私有缓存隐藏物。

如果存在限定的私有响应指令,并且参数为列出一个或多个字段名,则只有列出的标题字段被限制为单用户:共享缓存不能存储列出的标题字段出现在原始回复中,但5月存储剩余的没有标题字段、主题的响应消息中定义的约束第3节.

给出的字段名称不限于标题集本规范定义的字段。字段名区分大小写。

此指令使用参数语法的quoted-string形式。发件人不应该生成令牌表单(即使没有出现引号单条目列表需要)。

5.2.2.8.代理重新验证

proxy-revalizate响应指令指示一旦响应已过时,共享缓存不能重用该响应以满足另一个请求,直到源站成功验证,定义如下第4.3节。这类似于必须重新验证(第5.2.2.2节),但代理重新验证不适用于私有缓存。

请注意,代理重新验证本身并不意味着响应是可缓存。例如,它可能与公共指令相结合(第5.2.2.9节),允许响应缓存,而只需要共享缓存在过时时重新验证。

5.2.2.9.公众的

公共响应指令指示缓存5月存储即使在其他情况下会被禁止约束定义于第3节换句话说,public显式地将响应标记为可缓存。例如,public允许共享缓存重用对包含以下内容的请求的响应授权标题字段(第3.5节).

请注意,没有必要在响应中添加公共指令根据,已可缓存第3节.

如果对公共指令的回应没有明确的新鲜度信息,它是启发式缓存的(第4.2.2节).

5.2.2.10.s-最大值

参数语法:

s-maxage响应指令指示,对于共享缓存此指令指定的最大年龄覆盖最大年龄由max-age指令或到期标题字段。

s-maxage指令包含代理重新验证响应指令的语义(第5.2.2.8节)用于共享缓存。共享缓存不能使用s-maxage重用过时的响应以满足另一个请求,直到源成功验证为止,因为由定义第4.3节.此指令还允许共享缓存重用对包含Authorization头字段的请求,符合上述要求关于最长使用年限和重新验证的要求(第3.5节).

此指令使用参数语法的标记形式:例如,'s-maxage=10'不是's-maxage=“10”'。发件人不得生成报价表。

5.2.3.扩展指令

Cache-Control头字段可以通过使用一个或更多扩展缓存指令。缓存必须忽略无法识别的缓存指令。

信息扩展(那些不需要更改缓存的扩展行为),而不改变其他指令的语义。

行为扩展被设计为通过充当缓存指令的现有基。同时提供了新指令和旧指令,以便不理解新指令的应用程序将默认为旧指令指定的行为,以及那些理解新指令将把它视为修改了相关的要求使用旧的指令。这样,现有可以在不破坏已部署缓存的情况下生成缓存指令。

例如,假设一个名为作为私人指令修改器的“社区”:此外对于私有缓存,只有指定的允许社区缓存响应。源服务器希望允许UCI社区在其共享缓存可以通过包括

Cache-Control:私有,社区=“UCI”

识别此类社区缓存指令的缓存可以扩展其行为符合该扩展。没有识别社区缓存指令将忽略它并遵守私人指令。

新的扩展指令应考虑定义:

  • 多次指定指令意味着什么,
  • 当指令不带参数时存在参数,
  • 当指令需要参数时,它是什么意思缺失,以及
  • 指令是特定于请求、特定于响应还是能够都可以使用。

5.2.4.缓存指令注册表

“超文本传输协议(HTTP)缓存指令注册表”定义了缓存指令。它已创建,现在维护在<https://www.iana.org/assignments/http-cache-directives网站>.

A注册必须包括以下字段:

  • 缓存指令名称
  • 指向规范文本的指针

要添加到此命名空间的值需要IETF审查(请参阅[射频c8126],第4.8节).

5.3.到期

“Expires”响应头字段提供了一个日期/时间,在该日期/时间之后响应被认为是过时的。请参见第4.2节对于新鲜度模型的进一步讨论。

Expires标头字段的存在并不意味着原始资源将在该时间、之前或之后改变或停止存在。

Expires字段值是HTTP-date时间戳,如中所定义第5.6.7节第页,共页[超文本传输协议].另请参见第4.2节用于分析特定于缓存的需求。

到期日=HTTP-date

例如

有效期至:1994年12月1日星期四16:00:00 GMT

缓存收件人必须解释无效的日期格式,尤其是值“0”,表示过去的时间(即“已过期”)。

如果响应包括控制缓存标题字段max-age指令(第5.2.2.1节),接收者必须忽略Expires标题字段。同样,如果响应包含s-maxage指令(第5.2.2.10节),共享缓存收件人必须忽略Expires标题字段。在这两种情况下,值in Expires仅适用于尚未实现的收件人高速缓存控制头字段。

没有时钟的源服务器(第5.6.7节第页,共页[超文本传输协议])不能生成Expires标题字段除非其值表示过去的固定时间(总是过期)或其值已由系统与资源关联时钟。

历史上,HTTP要求Expires字段值不超过未来一年。而更长的新鲜寿命不再已证明禁止的、超大值会导致问题(例如,由于使用32位整数时间值),许多缓存将比那个。

5.4.布拉格

为HTTP/1.0缓存定义了“Pragma”请求头字段,以便客户端可以指定“no-cache”请求(作为控制缓存直到HTTP/1.1才定义)。

然而,现在广泛支持Cache-Control。因此,这规范不支持Pragma。

5.5.警告

“Warning”(警告)标题字段用于携带附加信息关于可能未反映的消息的状态或转换在状态代码中。本规范将其作废,因为它并不广泛生成或呈现给用户。它携带的信息可以被收集检查其他标题字段,例如年龄.

6与应用程序和其他缓存的关系

使用HTTP的应用程序通常指定其他形式的缓存。对于例如,Web浏览器通常具有“返回”按钮等历史记录机制可用于重新显示早期在会话。

同样,一些Web浏览器实现了图像和其他资产的缓存在页面视图中;他们可能尊重也可能不尊重HTTP缓存语义。

本规范中的要求不一定适用于应用程序在从HTTP缓存中检索数据之后使用数据。例如历史机制可以显示以前的表示,即使它有过期,应用程序可以以其他方式使用缓存数据新鲜度寿命。

此规范不禁止应用程序将HTTP缓存纳入账户;例如,历史机制可能会告诉用户是过时的,或者它可能遵循缓存指令(例如,cache-Control:无存储)。

但是,当应用程序缓存数据而不进行此操作时对于用户来说显而易见或易于控制,强烈建议根据HTTP缓存指令定义其操作,以便不会让期待缓存语义的作者感到惊讶我很荣幸。例如,虽然定义应用程序缓存“高于”HTTP,允许响应包含Cache-Control:无存储可用于直接相关的请求到获取它的请求(例如在同一页面中创建的请求加载),如果这样做,用户和作者可能会感到惊讶和困惑允许对与来自的请求无关的请求进行重用这是获得的。

7安全注意事项

本节旨在告知开发人员、信息提供商和具有特定于HTTP缓存的已知安全顾虑的用户。“HTTP/1.1”中介绍了更多一般安全注意事项(第11节第页,共页[HTTP/1.1协议])和“HTTP语义”(第17节第页,共页[超文本传输协议]).

缓存会暴露额外的攻击面,因为缓存是恶意攻击的目标。由于缓存内容在HTTP请求完成后仍然存在,因此会发生攻击在用户认为信息已从网络中删除。因此,缓存内容需要作为敏感信息进行保护。

特别是,由于私有缓存仅限于单个用户,它们可以用于重建用户的活动。因此,它是对于用户代理来说,允许最终用户控制它们很重要,例如,通过允许删除部分或所有源服务器的存储响应。

7.1.缓存中毒

将恶意内容存储在缓存中会扩大攻击者的攻击范围影响多个用户。这样的当攻击者使用实现缺陷、提升的权限或其他要插入的技术缓存中的响应。这在共享缓存时尤其有效用于向许多客户端分发恶意内容。

缓存中毒的一个常见攻击向量是利用在代理和用户代理上进行消息解析;看见第6.3节第页,共页[HTTP/1.1协议]有关以下方面的相关要求HTTP/1.1。

7.2.定时攻击

因为缓存的主要用途之一是优化性能,它的使用可能会“泄露”以前使用过哪些资源的信息请求。

例如,如果用户访问某个站点,并且其浏览器缓存了其响应,然后导航到第二个站点,该站点可以尝试它知道第一个站点上存在负载响应。如果他们加载很快,可以假设用户已经访问了该站点,甚至它的特定页面。

通过向缓存密钥,例如引用站点的标识(以防止上述攻击)。这有时被称为“双重键入”。

7.3.敏感信息的缓存

实现和部署缺陷(通常由对缓存的误解导致操作)可能导致缓存敏感信息(例如。,身份验证凭据)被认为是私有的,将其公开给未经授权的各方。

请注意,Set-Cookie响应头字段[库基]不禁止缓存;具有Set-Cookie标头的可缓存响应字段可以(并且经常)用于满足对缓存的后续请求。鼓励希望控制这些响应缓存的服务器发出适当的Cache-Control响应头字段。

8IANA考虑

以下注册的更改控制器为:“IETF(iesg@ietf.org)-互联网工程任务组”。

8.1.字段名称注册

IANA更新了“超文本传输协议(HTTP)字段名称注册”<https://www.iana.org/assignments/http-fields网站>,如中所述第18.4条第页,共页[超文本传输协议],字段名如下表所示:

表1
字段名称 状态 章节 评论
年龄 永久的 5.1
控制缓存 永久的 5.2
到期 永久的 5.3
布拉格 已弃用 5.4
警告 过时的 5.5

8.2.缓存指令注册

IANA已更新“超文本传输协议(HTTP)缓存指令注册表”<https://www.iana.org/assignments/http-cache-directives网站>按照注册程序第5.2.4节以及下表中总结的缓存指令名称。

表2
缓存指令 章节
最大年龄 5.2.1.1,5.2.2.1条
最高售价 5.2.1.2
最小新鲜度 5.2.1.3
必须重新验证 5.2.2.2
必须理解 5.2.2.3
无缓存 5.2.1.4,5.2.2.4
无存储 5.2.1.5,5.2.2.5
不转换 5.2.1.6,5.2.2.6
仅限if-cached 5.2.1.7
私有的 5.2.2.7
代理重新验证 5.2.2.8
公众的 5.2.2.9
s-最大值 5.2.2.10

8.3.警告代码注册表

IANA在“超文本传输协议(HTTP)警告代码”中添加了以下注释注册表位于<https://www.iana.org/assignments/http-warn-codes>声明“警告”已作废:

警告标题字段(及其使用的警告代码)已过时根据[RFC9111]进行HTTP。

9参考文献

9.1.规范性引用文件

【HTTP】
Fielding,R.编辑。,诺丁汉,M.,Ed。、和J.Reschke,编辑。,“HTTP语义”,标准97,副本请求9110,内政部10.17487/RFC9110,,<https://www.rfc-editor.org/info/rfc9110>.
[RFC2119]
布拉德纳,S。,“RFC中用于指示需求级别的关键字”,业务连续性计划14,副本请求2119,内政部10.17487/RFC2119,,<https://www.rfc-editor.org/info/rfc2119>.
[RFC5234]
克罗克,D.,编辑。P.奥维尔,“语法规范的增强BNF:ABNF”,标准68,副本请求5234,内政部10.17487/RFC5234,,<https://www.rfc-editor.org/info/rfc5234>.
[RFC7405]
基齐瓦特,P。,“ABNF中的大小写敏感字符串支持”,副本请求7405,内政部10.17487/RFC7405,,<https://www.rfc-editor.org/info/rfc7405>.
[RFC8174]
B.雷巴。,“RFC 2119关键字中大写与小写的歧义”,业务连续性计划14,射频代码8174,内政部10.17487/RFC8174,,<https://www.rfc-editor.org/info/rfc8174>.

9.2.资料性引用

A.巴特。,“HTTP状态管理机制”,射频6265,内政部10.17487/RFC6265,,<https://www.rfc-editor.org/info/rfc6265>.
[HTTP/1.1]
Fielding,R.编辑。,诺丁汉,M.,Ed。、和J.Reschke,编辑。,“HTTP/1.1”,标准99,副本请求9112,内政部10.17487/RFC9112,,<https://www.rfc-editor.org/info/rfc9112(网址:https://www.rfc-editor.org/info/rfc9112)>.
[RFC2616]
R·菲尔丁。,J.盖蒂斯。,J·莫格尔。,H·弗莱斯蒂克。,梅森特,L。,利奇,P。、和T.伯纳斯-李,“超文本传输协议--HTTP/1.1”,RFC 2616号文件,内政部10.17487/RFC2616,,<https://www.rfc-editor.org/info/rfc2616>.
[RFC5861]
M.诺丁汉。,“HTTP缓存-过时内容的控制扩展”,RFC 5861号文件,内政部10.17487/RFC5861,,<https://www.rfc-editor.org/info/rfc5861>.
[参考编号:RFC7234]
Fielding,R.编辑。,诺丁汉,M.,Ed。、和J.Reschke,编辑。,“超文本传输协议(HTTP/1.1):缓存”,副本请求7234,内政部10.17487/RFC7234,,<https://www.rfc-editor.org/info/rfc7234>.
[RFC8126]
棉花,M。,B.雷巴。、和T.Narten公司,“在RFC中编写IANA注意事项部分的指南”,业务连续性计划26,副本请求8126,内政部10.17487/RFC8126,,<https://www.rfc-editor.org/info/rfc8126>.

附录A。收集的ABNF

在下面收集的ABNF中,列表规则根据展开第5.6.节第页,共页[超文本传输协议].

年龄=增量秒Cache-Control=[Cache-directive*(OWS“,”OWS Cache-derictive)]到期日=HTTP-dateHTTP-date=<HTTP-dte,见[HTTP]第5.6.7节>OWS=参见[HTTP]第5.6.3节>cache-directive=token[“=”(token/quoted-string)]增量秒=1*DIGITfield-name=参见[HTTP]第5.1节>带引号的字符串=<带引号的字符串,参见[HTTP],第5.6.4节>token=<令牌,参见[HTTP]第5.6.2节>

附录B。RFC 7234的变更

已明确处理重复和冲突的缓存指令。(第4.2.1节)

位置和内容位置中URI的缓存失效标题字段不再是必需的,但仍然是允许的。(第4.4节)

不允许位置和内容位置标头字段中URI的缓存无效当起源不同时;以前是主持人。(第4.4节)

已明确处理无效和多个“年龄”标题字段值。(第5.1节)

该规范定义的一些缓存指令现在具有更强的禁止生成报价形式的价值,因为人们发现这会造成互操作性问题。的消费者不再需要扩展缓存指令来接受令牌和引用字符串形式,但它们仍需要对其进行适当的解析未知扩展名。(第5.2节)

明确了公共和私有缓存指令,以便在任何情况下都不要使响应可重用。(第5.2.2节)

引入了必须理解的缓存指令;缓存没有理解新响应状态代码的语义需要更长的时间除非它存在。(第5.2.2.3节)

警告响应标头已废弃。大部分信息可以通过检查响应来收集警告支持的信息剩余的信息虽然可能有用,但完全是咨询的。实际上,警告不是由缓存或中介添加的。(第5.5节)

致谢

见附录“确认”[超文本传输协议],也适用于本文件。

索引

A类 C类 E类 F类 G公司 H(H) M(M) N个 O(运行) P(P) S公司 V(V) W公司

作者地址

罗伊·T·菲尔丁(编辑)
土砖
公园大道345号
加利福尼亚州圣何塞市,邮编:95110
美利坚合众国
URI(URI): https://roy.gbiv.com/
马克·诺丁汉(编辑)
快速地
普拉兰
澳大利亚
朱利安·雷施克(编辑)
greenbytes股份有限公司
哈芬威格16
穆斯特48155
德国