Citrix ADC

调用 HTTP 标注

配置 HTTP 标注后,可以通过在高级策略规则中包含 SYS.HTTP_CALLOUT(<name>) 表达式来调用标注。在此表达式中, <name> 是要调用的 HTTP 标注的名称。

您可以将高级策略表达式运算符与标注表达式结合使用,以处理响应,然后执行适当的操作。来自 HTTP callout Agent 的响应的返回类型决定了可用于响应的运算符集。如果要分析的响应部分是文本,则可以使用文本运算符来分析响应。例如,您可以使用 CONTAINS(<string>) 运算符检查响应的指定部分是否包含特定的字符串,如以下示例所示:

SYS.HTTP_CALLOUT(mycallout).contains("Good IP address")
<!--NeedCopy-->

如果在响应程序策略中使用上述表达式,则可以配置适当的响应程序操作。

同样,如果要评估的响应部分是数字,则可以使用 GT (int) 之类的数字运算符。如果响应包含布尔值,则可以使用布尔运算符。

注意:HTTP 标注可以递归地调用自身。通过将 HTTP 标注表达式与防止递归的高级策略表达式结合起来,可以避免 HTTP 标注递归。有关如何避免 HTTP 标注递归的信息,请参阅 避免 HTTP 标注递归

您还可以通过配置策略,每个策略在评估之前生成的标注后调用一个标注,来级联 HTTP 标注。在这种情况下,在一个策略调用标注之后,当 Citrix ADC 设备在将标注发送到标注服务器之前解析标注时,第二组策略可以评估标注并调用其他标注,然后可以通过第三组策略进行评估,依此类推。下面的示例描述了这样的实现。

首先,您可以配置名为 myCallout1 的 HTTP 标注,然后配置响应程序策略 Pol1 来调用 myCallout1。然后,您可以配置第二个 HTTP 标注 myCallout2 和响应程序策略 Pol2。您可以将 Pol2 配置为评估 myCallout1 并调用 myCallout2。您可以全局绑定两个响应程序策略。

为避免 HTTP 标注递归,myCallout1 配置了一个名为 “Request1” 的唯一自定义 HTTP 标头。“ Pol1 配置为通过使用高级策略表达式避免 HTTP 标注递归,

HTTP.REQ.HEADER("Request1").EQ("Callout Request").NOT.
<!--NeedCopy-->

Pol2 使用相同的高级策略表达式,但不包括 .NOT 运算符,以便该策略在 Citrix ADC 设备解析 myCallout1 时对其进行评估。请注意,myCallout2 标识了自己的唯一标头,称为 “Request2”,Pol2 包含一个高级策略表达式,以防止 myCallout2 递归调用自身。

示例:

> add policy httpCallout myCallout1

Done

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

Done

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

Done

> bind responder global Pol1 100 END -type OVERRIDE

Done

> add policy httpCallout myCallout2

Done

> set policy httpCallout myCallout2 -IPAddress 10.102.3.96 -port 80 -returnType TEXT -hostExpr
""10.102.3.96"" -urlStemExpr ""/cgi-bin/check_clnt_location_from_database.pl"" -headers Request2
("Callout Request") -parameters cip(CLIENT.IP.SRC) -resultExpr "HTTP.RES.BODY(200)"

 Done

> add responder policy Pol2 "HTTP.REQ.HEADER("Request2").EQ("Callout Request").NOT &&
 HTTP.REQ.HEADER("Request1").EQ("Callout Request") && SYS.HTTP_CALLOUT(myCallout2).CONTAINS
("APAC")" RESET

 Done

> bind responder global Pol2 110 END -type OVERRIDE

Done
<!--NeedCopy-->
调用 HTTP 标注