Citrix ADC

配置 曲奇标头和轮询

本主题介绍了如何配置缓存管理 Cookie、HTTP标头和源服务器轮询。这包括修改导致缓存偏离文档标准的默认行为、覆盖可能导致可缓存内容不存储在缓存中的 超文本传输协议标头,以及将缓存配置为始终轮询源以获取更新内容。

缓存行为与标准的背离

默认情况下,集成缓存遵循以下 RFC标准:

  • RFC 2616,“HTTP HTTP / 1.1”
  • RFC2617“HTTP身份验证:基本和摘要式访问身份验证”中描述的缓存行为
  • RFC 2965“HTTP状态管理机制”中描述的缓存行为

内置策略和“默认“内容组属性可确保符合大多数这些标准。

默认的集成缓存行为与规范不同,如下所示:

  • 对 变化标题的支持有限。默认情况下,包含 变化标头的任何响应都被视为不可缓存,除非它被压缩。压缩的响应包含内容编码:gzip、内容编码:放缩或内容编码:pack200 gzip即使包含 更改:Accet Eng编码头,也可以缓存。
  • 集成缓存忽略标头缓存控制的值:无缓存和缓存控制:私有。例如,包含 缓存控制的响应 no cache=“设置Cookie”被视为包含 缓存控制:没有缓存的响应。默认情况下,不会缓存响应。
  • 图像 (内容类型=图像/*)始终被视为可缓存,即使图像响应包含 设置cookie或 set-cookie2标头,或图像请求包含 曲奇标头。在缓存之前,集成的缓存将从响应中删除 设置cookie和 set-cookie2头。这与 RFC 2965不同。您可以配置 RFC兼容的行为,如下所示:
添加缓存策略rfc_兼容_映像_策略-规则“http.res.header.set-cookie2.exists | | http.res.header.set cookie.exists”-操作NOCACHE绑定缓存全局rfc_兼容_映像_策略-优先级100-类型请求覆盖<!--NeedCopy-->
  • 请求中的以下缓存控制标头强制符合 RFC标准的缓存从源服务器重新加载缓存的响应:

缓存控制:最大年龄=0

缓存控制:没有缓存

为了防范拒绝服务攻击,此行为不是默认行为。

  • 默认情况下,缓存模块将响应视为可缓存的响应,除非其他响应头状态。若要使此行为符合 RFC2616请将所有内容组的-weakPosRelExpiry-软弱的设置为 0。

曲奇通常针对用户个性化,通常不应缓存。删除响应cookie参数在缓存响应之前删除设置Cookie和设置Cookie 2标头。默认情况下,内容组的删除响应cookie选项会阻止使用设置CookieSet-Cookie2标头缓存响应。

注意: 缓存图像时,内置的行为是在缓存之前删除设置CookieSet-Cookie2标头,无论内容组是如何配置的。

Citrix建议您接受存储嵌入式响应的每个内容组的默认值删除响应cookie,例如图像。

要使用命令行界面为内容组配置删除响应cookie,请执行以下操作:

在命令提示符下,键入:

设置缓存内容组-removeCookies是

  1. 导航到优化>集成缓存>内容组,然后选择内容组。
  2. 在“其他”选项卡上的“设置”组中,选择“删除响应 饼干“选项。

在响应时插入HTTP标头

集成缓存可以在缓存请求产生的响应中插入 超文本传输协议标头。Citrix ADC设备不会更改缓存未命中导致的响应中的标题。

下表描述了可以在响应中插入的标头。

标题 规范
年龄 提供响应的时间(以秒为单位),该时间从源服务器上生成响应的时间计算出来。默认情况下,缓存会为从缓存提供的每个响应插入 年龄标头。
通过 列出请求或响应的起始点和终止点之间的协议和收件人。Citrix ADC设备在其从缓存提供的每个响应中插入 通过标头。插入的报头的默认值为“NS-CACHE-9.2:Citrix ADC IP地址的最后一个二进制八位数”。有关详细信息,请参阅“为缓存配置全局属性”。“
标签 缓存支持使用上次修改和标签标头进行响应验证,以确定响应是否过时。仅当缓存响应而源服务器尚未插入自己的标签标头时,缓存才会在响应中插入标签标签值是任意的唯一数字。如果从源服务器刷新响应,则响应的标签值会发生变化,但是如果服务器发送 304(未更新对象)响应,它将保持不变。源服务器通常不会为动态内容生成验证器,因为动态内容被认为是不可缓存的。您可以覆盖此行为。插入标签标头时,允许缓存无法提供完整的响应。相反,用户代理需要首次缓存集成缓存发送的动态响应。要强制用户代理缓存响应,您可以将集成缓存配置为插入标签标头并替换原始提供的cache - control标头。
缓存控制 Citrix ADC设备通常不会在源服务器提供的响应中修改可缓存标头。如果源服务器发送标记为不可缓存的响应,则客户端将响应视为不可缓存,即使 Citrix ADC设备缓存响应也是如此。要在用户代理中缓存动态响应,可以从源服务器替换 缓存控制标头。这仅适用于用户代理和其他干预缓存。它们不会影响集成缓存。
标题 规范
年龄 提供响应的时间(以秒为单位),该时间从源服务器上生成响应的时间计算出来。默认情况下,缓存会为从缓存提供的每个响应插入 年龄标头。
通过 列出请求或响应的起始点和终止点之间的协议和收件人。Citrix ADC设备在其从缓存提供的每个响应中插入 通过标头。插入的报头的默认值为“NS-CACHE-9.2:Citrix ADC IP地址的最后一个二进制八位数”。有关详细信息,请参阅“为缓存配置全局属性”。“
标签 缓存支持使用 “上次修改” 和 “标签标头” 进行响应验证,以确定响应是否过时。仅当缓存响应而源服务器尚未插入自己的标签标头时,缓存才会在响应中插入标签标签值是任意的唯一数字。如果从源服务器刷新响应,则响应的标签值会发生变化,但是如果服务器发送 304(未更新对象)响应,它将保持不变。源服务器通常不会为动态内容生成验证器,因为动态内容被认为是不可缓存的。您可以覆盖此行为。插入标签标头时,允许缓存无法提供完整的响应。相反,用户代理需要首次缓存集成缓存发送的动态响应。要强制用户代理缓存响应,您可以将集成缓存配置为插入标签标头并替换原始提供的cache - control标头。
缓存控制 Citrix ADC设备通常不会在源服务器提供的响应中修改可缓存标头。如果源服务器发送标记为不可缓存的响应,则客户端将响应视为不可缓存,即使 Citrix ADC设备缓存响应也是如此。要在用户代理中缓存动态响应,可以从源服务器替换 缓存控制标头。这仅适用于用户代理和其他干预缓存。它们不会影响集成缓存。

插入年龄、通过或标签标题

以下过程描述了如何插入年龄、通过和 埃塔格标头。

使用 Citrix ADC命令界面插入“时间”、“通过”或“Etag”头

在命令提示符下,键入:

设置缓存内容组-insertVia YES-insertAge YES-inserttag YES

使用 Citrix ADC图形用户界面配置年龄、通过或 埃塔格标头

  1. 导航到优化>集成缓存>内容组,然后选择内容组
  2. 在“其他”选项卡上的“HTTP标头插入”组中,根据需要选择“通过”、“年龄”或“埃塔格”选项。
  3. 其他标头类型的值将自动计算。您可以在缓存的主设置中配置 通过值。

    配置 超文本传输协议标头插入

插入cache - control标头

当集成缓存替换源服务器插入的 缓存控制标头时,它还会替换“过期”标头。新的过期标头包含过去的过期时间。这可以确保 HTTP/1.0客户端和缓存(不了解 缓存控制标头)不会缓存内容。

使用 Citrix ADC命令界面插入缓存控制标头

在命令提示符下,键入:

设置缓存内容组-cacheControl

使用 Citrix ADC图形用户界面插入缓存控制标头

  1. 导航到“优化”>“集成缓存”>“内容组”,以及
    1. 单击“过期方法”选项卡,清除启发式和默认过期设置,并在“过期后的内容”文本框中设置相关值。
    2. 单击“其他“选项卡,然后在“cache - control”文本框中键入要插入的标头。或者,单击”配置”以在缓存响应中设置cache - control指令。

忽略请求中的缓存控制和指示标头

默认情况下,缓存模块处理 缓存控制和 布拉格马标头。缓存控制标头中的以下令牌按照 RFC2616中的描述进行处理。

  • 最大时代
  • 最大陈旧
  • 只有如果缓存
  • 无缓存

请求中的 拉普拉:没有缓存标头与 缓存控制:没有缓存标头相同。

如果将缓存模块配置为忽略cache - control标头和编译指示标头,则包含cache - control: no - cache标头的请求会导致Citrix ADC设备从源服务器检索响应,但缓存的响应不会更新。如果缓存模块处理cache - control和编译指示标头,则会刷新缓存的响应。

下表总结了各种设置对这些标头和忽略浏览器的重新加载请求设置的影响。

忽略cache - control和编译指示标头的设置 忽略浏览器重新加载请求的设置 结果
是或否 忽略客户端的 缓存控制和 布拉格马标头,包括 缓存控制:没有缓存指令。
缓存控制:没有缓存标头会产生缓存未命中,但缓存中已存在的响应不会刷新。
包含 缓存控制:没有缓存标头的请求会导致缓存错误,并刷新存储的响应。

使用命令行界面忽略请求中的 缓存控制和 布拉格马标头

在命令提示符下,键入:

设置缓存内容组 -ignoreReqCachingHdrs YES

使用命令行界面忽略浏览器重新加载请求

在命令提示符下,键入:

设置缓存内容组-ignoreReloadReq否

注意:默认情况下,-IgnreLoadReq参数设置为 对

使用 桂忽略请求中的缓存控制和 布拉格马标头

  1. 导航到优化>集成缓存>内容组,然后选择内容组。
  2. 其他选项卡上的设置组中,选择请求选项中的忽略 缓存控制和 布拉格马标头

    配置缓存控制和 布拉格马标头

忽略缓存控制标头的策略示例:

在以下示例中,您将请求时间覆盖策略配置为缓存包含 内容类型:image/*的响应,而不考虑响应中的 缓存控制标头。

配置请求时间覆盖策略以缓存带有 图像/*的所有响应

使用“全部失效”选项刷新缓存。

配置新的缓存策略,并将策略定向到特定内容组。有关详细信息,请参阅“在集成缓存中配置策略。

确保策略使用的内容组配置为忽略 缓存控制标头,如“在请求中忽略 缓存控制和 布拉格马标头”中所述。

将策略绑定到请求时间覆盖策略库。

有关更多信息,请参阅全局绑定集成缓存策略主题。

每次收到请求时轮询源服务器

您可以将 Citrix ADC设备配置为在提供存储响应之前始终咨询源服务器。这被称为投票每次 (宠物)当 Citrix ADC设备咨询源服务器且 宠物响应尚未过期时,来自源服务器的完整响应不会覆盖缓存内容。此属性在提供特定于客户端的内容时很有用。

宠物响应过期后,Citrix ADC设备会在第一个完整响应从源服务器到达时刷新该响应。

每次轮询 (宠物)函数的工作原理如下:

对于具有标签或上次修改标头形式的验证器的缓存响应,如果响应过期,它将自动标记为 宠物并缓存。

您可以为内容组配置宠物。

如果将内容组配置为 宠物则内容组中的每个响应都标记为 宠物,宠物内容组可以存储没有验证器的响应。自动标记为 宠物的响应始终过期。根据您配置内容组的方式,属于 宠物内容组的响应可能在延迟后过期。

轮询会影响两种类型的请求:

  • 条件请求:客户端发出条件请求,以确保其所拥有的响应是最新的副本。缓存 宠物响应的用户代理请求始终转换为条件请求并发送到源服务器。条件请求在 如果-修改-自始或 如果-无匹配标头中具有验证程序。如果-修改-因为标题包含上次修改标题的时间。如果无匹配标题包含响应的标签标题值。如果客户端的响应副本是新的,则源服务器将以 304“未修改”进行回复。如果副本过时,条件响应会生成包含整个响应的 200好
  • 无条件请求:非条件请求只能生成包含整个响应的 200好
源服务器响应 操作
发送完整的回复 源服务器按原样向客户端发送响应。如果缓存的响应已过期,则会刷新该响应。
304未修改 304年响应中的以下标头值与缓存的响应合,并缓存的响应提供给客户端:日期、到期,年龄,cache - control标头信息和S-Maxage令牌
401 未经授权;400 错误请求;405 不允许使用;406 不可接受;407 代理身份验证需要 源的响应按原样提供给客户端。缓存的响应不会更改。
任何其他错误响应,例如 404 未找到 源的响应按原样提供给客户端。缓存的响应将被删除。

注意:“每次轮询”参数将受影响的响应视为不可存储。

使用命令行界面每次配置轮询

在命令提示符下,键入:

添加缓存contentgroup-pollEveryTime是

使用GUI进行轮询

  1. 导航到优化>集成缓存>内容组,然后选择内容组。
  2. 在“其他”选项卡上的“设置”组中,选择“每次轮询”(为每个请求验证带有源的缓存内容)选项。

    内容组轮询配置

宠物和客户特定内容

宠物功能可以确保为客户端定制内容。例如,以多种语言提供内容的网站会检查“接受语言”请求标头,以选择其所提供内容的语言。对于英语为主要语言的多语言网站,所有英语内容都可以缓存在 宠物内容组中。这可确保每个请求都会转到源服务器以确定响应的语言。如果响应是英语,并且内容没有更改,则源服务器可以为缓存提供 304未修改。

以下示例显示了用于在 宠物内容组中缓存英语响应、配置用于标识缓存中英语响应的命名表达式以及配置使用此内容组和命名表达式的策略的命令。粗体用于强调:

添加缓存内容组EnglishLanguageGroup-PolleTime YES添加表达式ContainesExpression–规则“http.res.header(\\\“Content Language\\”)。contains(\\\“en\\”)”添加缓存策略englishPolicy-规则包含表达式-操作缓存-存储组EnglishLanguage组绑定缓存策略englishPolicy-优先级100-PreferenceDefRules NO<!--NeedCopy-->

宠物和认证、授权和审核

Outlook Web访问 (OWA)是一个很好的例子,动态生成的内容从 宠物中受益。所有邮件回复(*.EML)对象)都有一个埃塔格验证器,可以将它们存储为 宠物响应。

每个邮件响应请求都会传递到源服务器,即使响应已缓存也是如此。源服务器确定请求程序是否经过身份验证和授权。它还验证响应是否存在于源服务器中。如果所有结果均为正数,则源服务器将发送 304未修改响应。