配置 Cookie、标头和轮询

本主题介绍了配置缓存如何管理 Cookie、HTTP 标头和源服务器轮询的过程,包括修改导致缓存偏离记录标准的默认行为、覆盖可能导致缓存内容不存储在缓存中的 HTTP 标头以及配置缓存以在特殊情况下始终轮询更新内容的源。

缓存行为与标准的背离

默认情况下,集成缓存符合以下标准:

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

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

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

  • 对 Vary 标题的支持有限。默认情况下,包含 Vary 标头的任何响应都被视为不可缓存,除非它被压缩。压缩响应包含 Content-Encoding: gzip、Content-Encoding: deflate 或 Content-Encoding: pack200-gzip,即使其包含 Vary: Accept-Encoding 标头,也可缓存。
  • 集成的缓存忽略标头 Cache-Control: no-cache 和 Cache-Control: private 的值。例如,包含 Cache-Control: no-cache=”Set-Cookie”的响应被视为响应包含 Cache-Control: no-cache。默认情况下,不会缓存响应。
  • 图像 (Content-Type = image/*) 始终被视为可缓存,即使图像响应包含 Set-Cookie 或 Set-Cookie2 标头,或图像请求包含 Cookie 标头。在缓存之前,集成的缓存将从响应中删除 Set-Cookie 和 Set-Cookie2 头。这与 RFC 2965 不同。您可以配置 RFC 兼容的行为,如下所示:
add cache policy rfc_compliant_images_policy -rule "http.res.header.set-cookie2.exists || http.res.header.set-cookie.exists" -action NOCACHE


bind cache global rfc_compliant_images_policy -priority 100 -type REQ_OVERRIDE
  • 请求中的以下 Cache-Control 标头强制符合 RFC 的缓存重新加载来自源服务器的缓存响应:

Cache-control: max-age=0

Cache-control: no-cache

为了防范拒绝服务攻击,此行为不是默认情况。有关详细信息,请参阅“插入 Cache-Control 标头”部分。

  • 默认情况下,缓存模块将响应视为可缓存,除非响应标头另有说明。若要使此行为符合 RFC 2616,请将所有内容组的 -weakPosRelExpiry 和 -weakNegResExpiry 设置为 0。

Cookie 通常针对用户个性化,通常不应缓存。“删除响应 Cookie”参数在缓存响应之前删除 Set-Cookie 和 Set-Cookie2 头。默认情况下,内容组的“删除响应 Cookie”选项可防止缓存带有 Set-Cookie 或 Set-Cookie2 的头的响应。

注意: 缓存图像时,内置的行为是在缓存之前删除 Set-Cookie 和 Set-Cookie2 标头,无论内容组是如何配置的。 注意: Citrix 建议您接受存储嵌入响应(例如图像)的每个内容组的默认“删除响应 Cookie”。

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

在命令提示窗口中,键入:

set cache contentgroup <name> -removeCookies YES

使用配置实用程序为内容组配置删除响应 Cookie

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

在响应时插入 HTTP 标头

集成缓存可以在缓存命中导致的响应中插入 HTTP 标头。Citrix® Citrix ADC® 设备不会更改缓存未命中导致的响应标头。

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

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

插入年龄、通过或 ETag 标头

以下过程描述了如何插入年龄、Via 和 ETag 标头。

要使用命令行界面插入年龄、Via 或 Etag 标头

在命令提示窗口中,键入:

set cache contentgroup <name> -insertVia YES -insertAge YES -insertETag YES

使用 GUI 插入年龄,通过或 Etag 标头

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

插入 Cache-Control 标头

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

使用命令行界面插入 Cache-Control 标头

在命令提示窗口中,键入:

set cache contentgroup <name> -cacheControl <value>

使用配置实用程序插入 Cache-Control 标头

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

忽略请求中的 Cache-Control 和 Pragma 标头

默认情况下,缓存模块处理 Cache-Control 和 Pragma 标头。Cache-Control 标头中的以下令牌按照 RFC 2616 中的描述进行处理。

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

请求中的 ragma: no-cache 标头与 Cache-Control: no-cache 标头相同。

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

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

忽略 Cache-Control 和 Pragma 标头的设置 忽略浏览器重新加载请求的设置 结果
是或否 忽略客户端的 Cache-Control 和 Pragma 标头,包括 Cache-Control: no-cache 指令。
Cache-Control: no-cache 标头会产生缓存未命中,但缓存中已存在的响应不会刷新。
包含 Cache-Control: no-cache 标头的请求会导致缓存错误,并刷新存储的响应。

使用命令行界面忽略请求中的 Cache-Control 和 Pragma 标头

在命令提示窗口中,键入:

set cache contentgroup <name> -ignoreReqCachingHdrs YES

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

在命令提示窗口中,键入:

set cache contentgroup <name> -ignoreReloadReq NO

注意: 默认情况下,-IreReload 参数设置为 YES。

使用 GUI 忽略请求中的 Cache-Control 和 Pragma 标头

  1. 导航到“优化”>“集成缓存”>“内容组”,然后选择内容组。
  2. 在“其他”选项卡上的“设置”组中,选择“忽略 **请求 中的 Cache-Control 和 Pragma 标头**”选项。

忽略 Cache-Control 标头的策略示例

在以下示例中,您将请求时间覆盖策略配置为缓存包含 Content-type: image/* 的响应,而不考虑响应中的 Cache-Control 标头。

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

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

有关详细信息,请参阅“内容组中的冲洗响应”。“

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

确保策略使用的内容组配置为忽略 Cache-Control 标头,如“在请求中忽略 Cache-Control 和 Pragma 标头”中所述。

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

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

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

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

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

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

对于具有 ETag 或最后修改标头形式的验证器的缓存响应,如果响应过期,它会自动标记为 PET 和缓存。

您可以为内容组配置 PET。

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

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

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

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

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

在命令提示窗口中,键入:

add cache contentgroup <contentGroupName> -pollEveryTime YES

使用 GUI 每次配置轮询

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

PET 和客户特定内容

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

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

add cache contentgroup EnglishLanguageGroup -pollEveryTime YES
add expression containsENExpression –rule "http.res.header(\\"Content-Language\\").contains(\\"en\\")"
add cache policy englishPolicy -rule containsENExpression -action CACHE -storeInGroup englishLanguageGroup
bind cache policy englishPolicy -priority 100 -precedeDefRules NO

PET 和认证、授权和审核

Outlook Web 访问 (OWA) 是一个很好的例子,动态生成的内容从 PET 中受益。所有邮件响应(*.EML 对象)都有一个 ETag 验证程序,使它们能够存储为 PET 响应。

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