超文本传输协议(HTTP)是一种无状态应用程序级协议使用可扩展语义和用于与基于网络的灵活交互的自描述性消息超文本信息系统。它通常用于分布式信息系统,其中使用响应缓存可以提高性能。本文件定义与缓存和重用响应相关的HTTP方面信息。¶
HTTP“缓存”是响应消息的本地存储控制其中消息的存储、检索和删除的子系统。缓存存储可缓存的响应,以减少响应时间和未来等效请求的网络带宽消耗。任何客户或服务器5月使用缓存,但当用作隧道时不使用缓存(第3.7节第页,共页[超文本传输协议]).¶
“共享缓存”是存储响应以供重用的缓存多个用户;通常(但不总是)部署共享缓存作为中间人的一部分。相比之下,“私有缓存”,专用于单个用户;通常,它们被部署为用户代理。¶
HTTP缓存的目标是显著提高性能通过重用先前的响应消息来满足当前请求。缓存将存储的响应视为“新的”,如第4.2节,如果可以重复使用“验证”(与源服务器进行检查,以查看缓存的响应对于此请求仍然有效)。因此,新的回应可以每次缓存重用时,都会减少延迟和网络开销。当缓存的响应不新鲜时,如果进行验证,它可能仍然可以重用可以提神(第4.3节)或者如果原点不可用(第4.2.4节).¶
本文件作废副本请求7234,变化总结如下附录B.¶
关键词“必须", "不能","必需的", "应", "不得", "应该", "不应该","推荐", "不推荐","5月“、和”可选的“在本文档中按BCP 14中所述进行解释[RFC2119协议]
[RFC8174号文件]当且仅当它们出现在所有首都时,如图所示。¶
第2节第页,共页[超文本传输协议]定义一致性标准并包含有关错误处理的注意事项。¶
本规范使用增广Backus-Naur形式(ABNF)表示法[RFC5234号文件],扩展了区分大小写的符号在中定义的字符串中[RFC7405协议].¶
它还使用在中定义的列表扩展名第5.6.1节第页,共页[超文本传输协议],允许使用“#”对逗号分隔的列表进行紧凑定义操作符(类似于“*”操作符指示重复的方式)。附录A用所有列表显示收集的语法运算符扩展为标准ABNF表示法。¶
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节>
¶
delta秒规则指定一个非负整数,表示时间以秒为单位。¶
收件人解析增量秒值并将其转换为二进制形式应使用至少31位非负整数的算术类型范围。如果缓存收到大于最大整数的增量秒值它可以表示,或者如果其任何后续计算溢出,缓存必须将该值视为2147483648(231)或它可以方便地使用的最大正整数代表。¶
正确的缓存操作保留了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节.¶
当使用存储的响应来满足请求而不进行验证时隐藏物必须生成年龄标题字段(第5.1节),将响应中存在的任何值替换为等于存储的响应的current_age;看见第4.2.3节.¶
缓存必须使用不安全方法的直写请求(第9.2.1条第页,共页[超文本传输协议])到源服务器;即,不允许缓存在转发请求之前生成对此类请求的回复,并且收到相应的响应。¶
此外,请注意,不安全的请求可能会使已存储的响应无效;看见第4.4节.¶
缓存可以使用存储或可存储的响应来满足多个请求,前提是允许重用该响应针对相关请求。这使缓存能够“崩溃”请求“--或将多个传入请求合并为单个转发缓存未命中时请求--从而减少源服务器上的负载和网络。但是,请注意,如果缓存无法使用返回的响应部分或全部崩溃的请求,它需要转发请求以满足它们,可能会引入额外的延迟。¶
当存储多个合适的响应时,缓存必须使用最近的一个(由日期标题确定字段)。它还可以通过“Cache-Control:max-age=0”或“Cache-Control:no-Cache”消除使用哪个响应的歧义。¶
没有时钟的缓存(第5.6.7节第页,共页[超文本传输协议])必须重新验证存储每次使用时的响应。¶
当缓存收到可由存储的响应满足的请求时存储的响应包含一个Vary头字段(第12.5.5条第页,共页[超文本传输协议]),缓存不能使用存储的响应而不重新验证,除非由该Vary字段值指定的所有呈现的请求标题字段匹配原始请求中的那些字段(即导致缓存响应被存储的请求)。¶
如果满足以下条件,则定义两个请求的头字段进行匹配只有当第一个请求中的那些可以转换为通过应用以下任何一种方法再次请求:¶
- 添加或删除标题字段中允许的空白语法¶
- 组合具有相同字段名的多个标题字段行(请参见第5.2节第页,共页[超文本传输协议])¶
- 以已知的方式规范化两个标题字段值根据标题字段的规范,语义相同(例如,当顺序不重要时,重新排序字段值;大小写规范化,其中值定义为大小写敏感)¶
如果(在可能发生的任何规范化之后)缺少标题字段从一个请求中,它只能匹配另一个同样不存在的请求那里。¶
一个存储的响应,其Vary标头字段值包含成员“*”总是不匹配。¶
如果多个存储的响应匹配,缓存需要选择一个来使用。当指定的请求标题字段具有已知的排序机制时(例如,Accept和类似请求头上的qvalues字段),该机制5月用于选择首选答案。如果这种机制不可用,或导致同等优先响应,最新响应(由日期标题字段确定)为选择,作为每第4节.¶
一些资源错误地从默认值中省略了Vary头字段响应(即,请求未表达任何偏好时发送的响应),其效果是为对该资源的后续请求选择它即使有更可取的回应。当缓存具有目标URI的多个存储响应,一个或多个忽略Vary头字段,缓存应该选择最近的(请参见第4.2.3节)使用有效Vary存储响应字段值。¶
如果没有存储的响应匹配,则缓存无法满足呈现的请求。通常,请求被转发到源服务器,可能添加了先决条件来描述缓存的响应已存储(第4.3节).¶
一个“新鲜”的反应是年龄还没有超过它的新鲜度寿命。相反,“陈腐”的反应就是这样。¶
回复的“新鲜寿命”是指时间长度从源服务器生成到过期时间之间。安“显式过期时间”是源服务器打算缓存不再使用存储的响应无需进一步验证,而“启发式过期当没有明确的到期时间可用。¶
回复的“年龄”是指回复后经过的时间由源服务器生成或成功验证。¶
当回应新鲜时,它可以用来满足在不联系源服务器的情况下执行后续请求,从而改进效率。¶
确定新鲜度的主要机制是源服务器使用到期标题字段(第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节解释一下缓存和历史机制。¶
缓存可以计算新鲜度生存期(表示为freshness_lifetime),通过评估以下规则并使用第一个匹配项:¶
请注意,此计算旨在通过使用源服务器尽可能提供的时钟信息。¶
当给定指令存在多个值时(例如,两个到期标题字段行或多个Cache-Control:max-age指令),则应使用第一次出现,或应使用响应被认为是陈腐的。如果指令冲突(例如。,max-age和no-cache都存在),最严格的指令应该我很荣幸。鼓励缓存考虑具有无效的新鲜度信息(例如,带有非整数内容的max-age指令)陈腐。¶
由于源服务器并不总是提供明确的过期时间隐藏物5月当显式时间不为指定,使用使用其他字段值的算法(例如最后修改的时间)来估计合理的到期时间时间。本规范没有提供具体的算法,但确实提供了对结果施加最坏的限制。¶
缓存不能当显式在存储的响应中存在过期时间。因为中的要求第3节,启发式只能用于没有显式的响应状态码定义为“启发式缓存”的新鲜度(例如,请参见第15.1条第页,共页[超文本传输协议])以及关于没有标记为显式可缓存的显式新鲜度(例如。,公共响应指令)。¶
注意,在前面的规范中,启发式缓存响应状态代码被称为“默认情况下可缓存”。¶
如果响应具有Last-Modified头字段(第8.8.2节第页,共页[超文本传输协议]),鼓励缓存使用启发式过期值,该值不超过自那一次。此分数的典型设置可能为10%。¶
这个年龄标题字段用于传递估计值从缓存中获取的响应消息的期限。年龄字段值是缓存对自源服务器生成以来的秒数的估计或验证响应。因此,“年龄”值为响应驻留在每个沿源服务器的路径缓存,加上时间已沿网络路径进行传输。¶
年龄计算使用以下数据:¶
- “年龄值”
- 术语“age_value”表示年龄标题字段(第5.1节),形式适合算术运算;或0(如果不可用)。¶
- “日期值”
- 术语“date_value”表示日期标题字段,采用适合算术的格式操作。请参见第6.6.1条第页,共页[超文本传输协议]用于定义Date标题字段和关于没有它的响应的要求。¶
- “现在”
- 术语“现在”是指此实现的时钟的当前值(第5.6.7节第页,共页[超文本传输协议]).¶
- “请求时间”
- 请求时的时钟值导致存储的响应。¶
- “响应时间”
- 响应时的时钟值已收到。¶
可以用两种完全独立的方法计算响应的年龄:¶
- “apparentage”:响应时间减去日期值,如果实现的时钟与源服务器的时钟相当同步。如果结果为负数,结果被替换为零。¶
- “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节.¶
缓存不能如果被禁止,则生成过时的响应明确的协议内指令(例如,通过no-cache响应指令、必须重新验证响应指令或适用的s-maxage或代理重新验证响应指令;看见第5.2.2节).¶
缓存不能除非断开连接,否则将生成过时的响应或客户端或源服务器明确允许这样做(例如,通过中的max-stale请求指令第5.2.1节,扩展指令,例如定义于[RFC5861协议],或根据配置与银行外合同)。¶
当缓存对请求的URI有一个或多个存储响应时,但不能为其中任何一种提供服务(例如,因为它们不新鲜,或者不能被选中;看见第4.1节),它可以使用条件请求机制(第13节第页,共页[超文本传输协议])在转发给的请求中让下一个入站服务器有机会选择一个有效的存储响应使用、更新过程中存储的元数据或替换使用新响应存储的响应。此过程称为“验证”或“重新验证”存储的响应。¶
生成条件验证请求时,缓存以它试图满足的请求,或者--如果它正在启动独立的请求——使用存储的通过复制方法、目标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值(不是实体标记)。¶
在大多数情况下,两个验证器都是在缓存验证请求中生成的,即使实体标记明显优越,也允许旧的中介不理解实体标记前提条件以进行适当响应的。¶
请求链中的每个客户端都可能有自己的缓存,因此这是常见的中间层的缓存接收来自其他(出站)缓存。同样,一些用户代理使用条件请求将数据传输限制为最近修改的表示或完成部分检索到的表示的传输。¶
如果缓存接收到可以通过重用存储的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节).¶
对条件请求的响应的缓存处理取决于状态代码:¶
- 304(未修改)响应状态代码表示存储的响应可以被更新和重用;看见第4.3.4节.¶
- 完整回复(即包含内容的回复)表示没有在条件请求中指定的存储响应中有合适。相反,缓存必须使用完整的响应满足要求。缓存5月存储如此完整的响应,受其约束(参见第3节).¶
- 但是,如果缓存收到5xx(服务器错误)在尝试验证响应时,它可以将此响应转发给请求的客户端,或将其作为服务器未能响应。在后一种情况下,缓存可以发送之前存储的响应,受其限制(请参见第4.2.4节),或重试验证请求。¶
当缓存收到304(未修改)响应时,它需要识别适合用新信息更新的存储响应提供,然后执行此操作。¶
要更新的初始存储响应集是那些可以选择用于该请求,即满足第4节,除了最后一个要求新鲜、陈腐或只是验证。¶
然后,通过以下第一个匹配项进一步过滤存储的初始响应集:¶
- 如果新响应包含一个或多个“强验证器”(请参阅第8.8.1节第页,共页[超文本传输协议]),然后每个强验证器标识要更新的选定表示。所有存储的初始集合中带有相同强验证器之一的响应将被标识为更新。如果没有一个初始集包含至少一个相同的强验证器,然后隐藏物不能使用新响应更新所有存储的响应。¶
- 如果新响应不包含强验证器,但包含一个或多个“弱验证器”,以及验证器对应于初始集合存储的响应之一,然后是最多的识别出最近的匹配存储响应以进行更新。¶
- 如果新响应不包括任何形式的验证器(例如其中客户端从生成If-Modified-Since请求Last-Modified响应头以外的源字段),并且在初始集合中只有一个存储的响应,并且该存储的响应还缺少验证器,然后识别存储的响应以进行更新。¶
对于标识的每个存储响应,缓存必须更新其标题字段与304中提供的标题字段(非修改)响应,根据第3.2节.¶
对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节).¶
因为不安全的请求方法(第9.2.1条第页,共页[超文本传输协议])例如PUT、POST或DELETE有可能更改源服务器上的状态,进行干预缓存需要使存储的响应失效,以使其内容保持最新。¶
缓存必须使目标URI无效(第7.1节第页,共页[超文本传输协议])当它收到非错误状态时响应的代码不安全的请求方法(包括安全性未知的方法)。¶
缓存5月当收到非错误状态时,使其他URI无效响应不安全请求方法的代码(包括安全性未知)。特别是位置和内容-位置响应标头字段(如果存在)是无效的候选字段;其他URI可能是通过本文档中未指定的机制发现。然而,缓存不能在这些条件下触发无效如果来源(第4.3.1节第页,共页[超文本传输协议])要失效的URI的不同于目标URI的(第7.1节第页,共页[超文本传输协议])。这有助于防止拒绝服务攻击。¶
“失效”意味着缓存将删除所有目标URI与给定URI匹配或标记它们的存储响应“无效”,需要在发送之前进行强制验证以响应随后的请求。¶
“无错误响应”是指带有2xx(成功)的响应或3xx(重定向)状态代码。¶
请注意,这并不保证所有适当的响应都是全局失效;状态更改请求只会导致无效它通过的缓存中的响应。¶
使用HTTP的应用程序通常指定其他形式的缓存。对于例如,Web浏览器通常具有“返回”按钮等历史记录机制可用于重新显示早期在会话。¶
同样,一些Web浏览器实现了图像和其他资产的缓存在页面视图中;他们可能尊重也可能不尊重HTTP缓存语义。¶
本规范中的要求不一定适用于应用程序在从HTTP缓存中检索数据之后使用数据。例如历史机制可以显示以前的表示,即使它有过期,应用程序可以以其他方式使用缓存数据新鲜度寿命。¶
此规范不禁止应用程序将HTTP缓存纳入账户;例如,历史机制可能会告诉用户是过时的,或者它可能遵循缓存指令(例如,cache-Control:无存储)。¶
但是,当应用程序缓存数据而不进行此操作时对于用户来说显而易见或易于控制,强烈建议根据HTTP缓存指令定义其操作,以便不会让期待缓存语义的作者感到惊讶我很荣幸。例如,虽然定义应用程序缓存“高于”HTTP,允许响应包含Cache-Control:无存储可用于直接相关的请求到获取它的请求(例如在同一页面中创建的请求加载),如果这样做,用户和作者可能会感到惊讶和困惑允许对与来自的请求无关的请求进行重用这是获得的。¶
已明确处理重复和冲突的缓存指令。(第4.2.1节)¶
位置和内容位置中URI的缓存失效标题字段不再是必需的,但仍然是允许的。(第4.4节)¶
不允许位置和内容位置标头字段中URI的缓存无效当起源不同时;以前是主持人。(第4.4节)¶
已明确处理无效和多个“年龄”标题字段值。(第5.1节)¶
该规范定义的一些缓存指令现在具有更强的禁止生成报价形式的价值,因为人们发现这会造成互操作性问题。的消费者不再需要扩展缓存指令来接受令牌和引用字符串形式,但它们仍需要对其进行适当的解析未知扩展名。(第5.2节)¶
明确了公共和私有缓存指令,以便在任何情况下都不要使响应可重用。(第5.2.2节)¶
引入了必须理解的缓存指令;缓存没有理解新响应状态代码的语义需要更长的时间除非它存在。(第5.2.2.3节)¶
警告响应标头已废弃。大部分信息可以通过检查响应来收集警告支持的信息剩余的信息虽然可能有用,但完全是咨询的。实际上,警告不是由缓存或中介添加的。(第5.5节)¶