避免 HTTP 标注递归

即使 Citrix ADC 设备不检查 HTTP 标注请求的有效性,它也会在将请求发送到 HTTP 标注代理之前解析请求一次。此解析允许设备将标注请求视为任何其他传入请求,从而允许您配置几个有用的 Citrix ADC 功能(如集成缓存)来处理标注请求。

但是,在此解析期间,HTTP 标注请求可能会触及相同的策略,因此会递归地调用自己。设备检测递归调用并引发未定义 (UnDF) 条件。但是,递归调用会导致策略和 HTTP 标注命中计数器增加两个计数,而不是每个计数一个计数。

要防止标注调用自身,您必须确定 HTTP 标注请求的至少一个唯一特性,然后排除调用标注的策略规则处理具有此特性的所有请求。您可以通过在策略规则中包含另一个默认语法表达式来执行此操作。表达式必须位于 SYS.HTTP_CALLOUT(<name>) 表达式之前,以便在评估标注表达式之前对其进行评估。例如:

<Expression that prevents callout recursion> && SYS.HTTP_CALLOUT(<name>)

以这种方式配置策略规则时,当设备生成请求并解析该请求时,复合规则的计算结果为 FALSE,不会再生成标注,并且命中计数器将正确递增。

为 HTTP 标注请求分配唯一特性的一种方法是在配置标注时包含唯一的自定义 HTTP 标头。下面是一个名为“myCallout”的 HTTP 标注示例。标注生成 HTTP 请求,用于检查客户端的 IP 地址是否存在于列入黑名单的 IP 地址的数据库中。标注包含一个名为“请求”的自定义标头,该标头被设置为值“标注请求”。“ 全局绑定响应程序策略“Pol1”调用 HTTP 标注,但排除其请求标头设置为此值的所有请求,从而防止再次调用 myCallout。阻止第二次调用的表达式是 HTTP.REQ.头(“请求”).EQ(“标注请求”)。不。

示例

> add policy httpCallout myCallout
 Done

> set policy httpCallout myCallout -IPAddress 10.102.3.95 -port 80 -returnType TEXT -hostExpr ""10.102.3.95"" -urlStemExpr ""/cgi-bin/check_clnt_from_database.pl"" -headers Request("Callout Request") -parameters cip(CLIENT.IP.SRC) -resultExpr "HTTP.RES.BODY(100)"
Done

> add responder policy Pol1 "HTTP.REQ.HEADER("Request").EQ("Callout Request").NOT && SYS.HTTP_CALLOUT(myCallout).CONTAINS("IP Matched")" RESET
Done

> bind responder global Pol1 100 END -type OVERRIDE
Done

注意: 您还可以配置表达式以检查请求的 URL 是否包含为 HTTP 标注配置的 URL 干表达式。如果要实现此方案,请确保 HTTP 标注代理专用于响应 HTTP 标注,而不是响应通过设备引导的其他客户端请求。如果 HTTP 标注代理是服务其他客户端请求的应用程序或 Web 服务器,则此类表达式将阻止设备处理这些客户端请求。而是使用前面所述的唯一自定义标头。

避免 HTTP 标注递归