Citrix ADC

配置cookie、报头和轮询

本主题解释如何配置缓存管理cookie、HTTP报头和源服务器轮询。这包括修改导致缓存偏离文档标准的默认行为,覆盖可能导致缓存中不存储可缓存内容的HTTP标头,以及将缓存配置为始终轮询原点以获取更新的内容。

缓存行为与标准的差异

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

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

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

默认的集成缓存行为与规范的差异如下:

  • 对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合规行为:
添加缓存策略rfc_compliant_images_policy -rule "http.res.header.set-cookie2 "。存在|| http.res.header.set-cookie。rfc_compliant_images_policy -priority 100 -type REQ\_OVERRIDE 
  • 请求中的以下缓存控制头迫使rfc兼容的缓存从源服务器重新加载缓存的响应:

cache - control:信息= 0

cache - control: no - cache

为了防止拒绝服务攻击,这种行为不是默认的。

  • 默认情况下,缓存模块认为响应是可缓存的,除非响应头另有状态。要使此行为符合RFC 2616,请设置-weakPosRelExpiry而且-weakNegResExpiry对于所有内容组为0。

从响应中删除cookie

cookie通常是为用户定制的,通常不应该被缓存。的删除响应cookie参数删除Set-Cookie和Set-Cookie2头文件,然后缓存响应。默认情况下,删除响应cookie选项用于内容组,以防止缓存响应set - cookieSet-Cookie2头。

注意:缓存图像时,内置行为是删除set - cookie而且Set-Cookie2不管内容组是如何配置的。

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

配置删除响应cookie对于一个内容组,使用命令行接口:

在命令提示符下,输入:

set cache contentgroup -removeCookies YES

使用Citrix ADC GUI为内容组配置“移除响应cookie”

  1. 导航到优化>集成缓存>内容组织,并选择内容组。
  2. 其他人选项卡,在设置group,选择“删除响应cookie”选项。

在响应时插入HTTP报头

集成缓存可以在缓存请求产生的响应中插入HTTP标头。Citrix ADC设备不会更改缓存丢失导致的响应中的报头。

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

规范
年龄 提供响应的时间(以秒为单位),从源服务器上生成响应的时间开始计算。默认情况下,缓存为从缓存提供的每个响应插入一个Age报头。
通过 列出请求或响应的起始点和结束点之间的协议和收件人。Citrix ADC设备在它从缓存提供的每个响应中插入一个Via报头。插入头的默认值为10.0 ns -缓存: Citrix ADC IP地址的最后八位。有关更多信息,请参见“为缓存配置全局属性”。
标签 缓存支持使用Last-Modified和标签头文件,以确定响应是否过期。缓存插入一个标签只有当它缓存响应并且源服务器没有插入自己的响应时才会在响应中标签头。的标签Value是一个任意的唯一数字。的标签如果从源服务器刷新响应,则响应的值将更改,但如果服务器发送一个304(未更新对象)响应,则该值将保持不变。源服务器通常不会为动态内容生成验证器,因为动态内容被认为是不可缓存的。您可以重写此行为。与标签头插入时,允许缓存不提供完整响应。相反,需要用户代理在第一次缓存集成缓存发送的动态响应。若要强制用户代理缓存响应,可将集成缓存配置为插入标签头并替换origin提供的Cache-Control头。
cache - control Citrix ADC设备通常不修改源服务器响应中的缓存头。如果源服务器发送的响应被标记为不可缓存,则客户机将响应视为不可缓存,即使Citrix ADC设备缓存了响应。要在用户代理中缓存动态响应,可以从源服务器替换cache - control头。这只适用于用户代理和其他介入缓存。它们不会影响集成缓存。
规范
年龄 提供响应的时间(以秒为单位),从源服务器上生成响应的时间开始计算。默认情况下,缓存为从缓存提供的每个响应插入一个Age报头。
通过 列出请求或响应的起始点和结束点之间的协议和收件人。Citrix ADC设备在它从缓存提供的每个响应中插入一个Via报头。插入的头的默认值为“NS-CACHE-9.2: Citrix ADC IP地址的最后一个字节”。有关更多信息,请参见“为缓存配置全局属性”。
标签 缓存支持使用Last-Modified和Tag标头进行响应验证,以确定响应是否过期。缓存插入一个标签只有当它缓存响应并且源服务器没有插入自己的响应时才会在响应中标签头。的标签Value是一个任意的唯一数字。的标签如果从源服务器刷新响应,则响应的值将更改,但如果服务器发送一个304(未更新对象)响应,则该值将保持不变。源服务器通常不会为动态内容生成验证器,因为动态内容被认为是不可缓存的。您可以重写此行为。与标签头插入时,允许缓存不提供完整响应。相反,需要用户代理在第一次缓存集成缓存发送的动态响应。若要强制用户代理缓存响应,可将集成缓存配置为插入标签头并替换origin提供的Cache-Control头。
cache - control Citrix ADC设备通常不修改源服务器响应中的缓存头。如果源服务器发送的响应被标记为不可缓存,则客户机将响应视为不可缓存,即使Citrix ADC设备缓存了响应。要在用户代理中缓存动态响应,可以从源服务器替换cache - control头。这只适用于用户代理和其他介入缓存。它们不会影响集成缓存。

插入年龄、via或Tag标头

下面介绍如何插入Age、Via和ETag标头。

使用Citrix ADC命令接口插入Age, Via或Etag头

在命令提示符下,输入:

set cache contentgroup -insertVia YES -insertAge YES -insertETag YES

使用Citrix ADC GUI配置Age、Via或Etag头

  1. 导航到优化>集成缓存>内容组织,并选择内容组
  2. 其他人选项卡,在“HTTP头插入”组中选择通过年龄,或ETag适当的选项。
  3. 其他报头类型的值将自动计算。在缓存的主设置中配置Via值。

    配置HTTP头插入

插入缓存控制头

当集成缓存替换了源服务器插入的cache - control头时,它也替换了Expires头。新的Expires头包含过去的过期时间。这确保了HTTP/1.0客户端和缓存(不理解cache - control头)不会缓存内容。

使用Citrix ADC命令接口插入缓存控制头

在命令提示符下,输入:

set cache contentgroup -cacheControl .使用实例

使用Citrix ADC GUI插入缓存控制头

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

忽略请求中的cache-control和pragma头

默认情况下,缓存模块处理Cache-Control和Pragma头文件。缓存控制头中的下列令牌将按照RFC 2616中的描述进行处理。

  • 信息
  • max-stale
  • only-if-cached
  • no - cache

请求中的Pragma: no-cache头与Cache-Control: no-cache头的处理方式相同。

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

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

设置忽略缓存控制和Pragma报头 设置忽略浏览器的重载请求 结果
是的 是或否 忽略来自客户端的Cache-Control和Pragma头文件,包括Cache-Control: no-cache指令。
没有 是的 cache - control: no-cache报头会产生一个缓存缺失,但是已经在缓存中的响应不会被刷新。
没有 没有 包含cache - control: no-cache头的请求会导致缓存丢失,并刷新存储的响应。

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

在命令提示符下,输入:

set cache contentgroup -ignoreReqCachingHdrs YES

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

在命令提示符下,输入:

set cache contentgroup - ignoreeloadreq NO . 0

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

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

  1. 导航到优化>集成缓存>内容组织,并选择内容组。
  2. 其他人选项卡,在设置组,选择忽略Cache-control和Pragma Headers请求选择。

    配置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 (Poll Every Time)函数的工作原理如下:

对于具有Tag或Last-Modified报头形式的验证器的缓存响应,如果响应过期,则自动将其标记为PET并缓存。

您可以为内容组配置PET。

如果将内容组配置为PET,则内容组中的每个响应都标记为PET。PET内容组可以存储没有验证器的响应。自动标记为PET的响应总是过期。属于PET内容组的响应可以在延迟后过期,具体取决于您如何配置内容组。

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

  • 有条件请求:客户端发出一个有条件请求,以确保它得到的响应是最新的副本。对缓存的PET响应的用户代理请求总是转换为有条件请求并发送到源服务器。中有条件请求的验证器if - modified - since具有头。的if - modified - since头包含从last - modified头。If-None-Match报头包含响应的Tag报头值。如果客户端响应的副本是新的,则源服务器返回304 Not Modified。如果副本已过期,则条件响应将生成一个200 OK,其中包含整个响应。
  • 非条件请求:非条件请求只能生成包含整个响应的200个OK。
源服务器响应 行动
发送完整的回复 源服务器将响应按原样发送到客户机。如果缓存的响应已经过期,则会刷新。
304未修改 304响应中的以下报头值与缓存的响应合并,并将缓存的响应提供给客户端:Date、Expires、Age、Cache-Control报头Max-Age和S-Maxage令牌
401授权;400坏请求;405方法不允许;406不可接受;407需要代理认证 源的响应按原样提供给客户机。缓存的响应不会改变。
任何其他错误响应,例如404 Not Found 源的响应按原样提供给客户机。缓存的响应被删除。

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

每次通过命令行接口配置轮询

在命令提示符下,输入:

add cache contentgroup -pollEveryTime YES

使用GUI进行投票

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

    内容组轮询配置

PET和客户特定内容

PET功能可以确保内容是为客户端定制的。例如,一个提供多种语言内容的网站会检查Accept-Language请求标头,以选择所服务内容的语言。对于以英语为主要语言的多语言网站,所有英语内容都可以缓存在PET内容组中。这确保每个请求都发送到源服务器,以确定响应的语言。如果响应是英文,并且内容没有更改,则源服务器可以向缓存提供一个304 not Modified。

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

添加缓存内容组english language -pollEveryTime YES添加表达式containsENExpression -rule "http.res.header(\\"Content-Language\\").contains(\\"en\\")"添加缓存策略englishPolicy -rule containsENExpression -action cache -storeInGroup EnglishLanguageGroup绑定缓存策略englishPolicy -priority 100 - prededefrules NO 

PET和身份验证、授权和审计

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

对邮件响应的每个请求都发送到源服务器,即使响应已被缓存。源服务器确定是否对请求者进行了身份验证和授权。它还验证响应是否存在于源服务器中。如果所有结果都为正,则源服务器发送一个304 Not Modified响应。