ADC

避免 HTTP 标注递归

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

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

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

<Expression that prevents callout recursion> OR SYS.HTTP_CALLOUT(<name>)
<!--NeedCopy-->

以这种方式配置策略规则时,当设备生成请求并对其进行解析时,复合规则的计算结果为 FALSE,不会再次生成标注,选择计数器也会正确递增。

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

例如

> 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
<!--NeedCopy-->

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

避免 HTTP 标注递归