ADC

避免 HTTP 标注递归

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

但是,在此解析过程中,HTTP callout 请求可以选择相同的策略,因此可以递归地调用自身。设备检测到递归调用并引发未定义 (UNDEF) 条件。但是,递归调用会导致策略和 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(“请求”).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
<!--NeedCopy-->

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

避免 HTTP 标注递归