Citrix ADC

复合高级策略表达式

您可以使用布尔运算符或算术运算符以及原子运算配置高级策略表达式。以下复合表达式具有布尔值 AND:

http.req.hostname.eq("mycompany.com") && http.req.method.eq(post)

以下表达式添加两个目标的值,并将结果与第三个值进行比较:

http.req.url.length + http.req.cookie.length \<= 500

复合表达式可以有任意数量的逻辑和算术运算符。

以下表达式评估 HTTP 请求的长度。此表达式基于 URL 和 cookie。 此表达式评估标题中的文本。另外,对这两个结果执行布尔 AND:

http.req.url.length + http.req.cookie.length \<= 500 && http.req.header.contains("some text")

您可以使用括号来控制复合表达式中的求值顺序。

复合表达式中的布尔值

您可以使用以下运算符配置复合表达式:

  • &&.

    此运算符是一个逻辑 AND。要使表达式的计算结果为 TRUE,所有组件必须计算为 TRUE。

    示例:

    http.req.url.hostname.eq(“myHost”) && http.req.header(“myHeader”).exists

  • ||.

    此运算符是一个逻辑 OR。如果表达式的任何组件的计算结果为 TRUE,则整个表达式为 TRUE。

  • !.

    P 对表达式做逻辑 NOP。

有时,Citrix ADC 配置实用程序会在 “ 添加表达式 ” 对话框中提供 AND、NOT 和 OR 运算符。但是,这些复合表达式的用途有限。Citrix 建议您使用运营商 &&、|| 和! 配置使用布尔逻辑的复合表达式。

复合表达式中的括号

您可以使用括号来控制表达式的求值顺序。以下是该命令的一个示例:

http.req.url.contains("myCompany.com") || (http.req.url.hostname.eq("myHost") && http.req.header("myHeader").exists)

下面是另一个示例:

(http.req.header("Content-Type").exists && http.req.header("Content-Type").eq("text/html")) || (http.req.header("Transfer-Encoding").exists || http.req.header("Content-Length").exists)

字符串的复合操作

下表描述了可用于配置字符串数据的复合操作的运算符。

生成字符串值的操作 说明
str + str 将运算符左侧的表达式的值与右侧的值连接起来。示例:http.req.hostname + http.req.url.protocol
str + num 将运算符左侧的表达式的值与右侧的数值连接起来。示例:http.req.hostname + http.req.url.content_length
num + str 将运算符左侧的表达式的数值与右侧的字符串值连接起来。示例:http.req.url.content_length + http.req.url.hostname
str + ip 将操作符左侧的表达式的字符串值与右侧的 IP 地址值连接起来。示例:http.req.hostname + 10.00.000.00
IP + str 将运算符左侧表达式的 IP 地址值与右侧的字符串值连接起来。示例:客户端 .ip.dst + http.req.url.hostname
str1 ALT str2 如果对 string1 的求值导致了 undef 异常或结果为空字符串,则使用 string2。否则使用 string1 并且永远不会评估 string2。示例:http.req.hostname alt 客户端 .ip.src
对产生 TRUE 或 FALSE 结果的字符串进行操作 说明
str == str 评估运算符两侧的字符串是否相同。下面是一个示例:http.req.header(“myheader”) == http.res.header(“myheader”)
str <= str 评估运算符左侧的字符串是否与右侧的字符串相同,还是在其前面按字母顺序排列。
str >= str 评估运算符左侧的字符串是否与右侧的字符串相同,还是按字母顺序跟随它。
str < str 评估运算符左侧的字符串是否位于右侧字母顺序的字符串之前。
str > str 评估运算符左侧的字符串是否按字母顺序跟随右侧的字符串。
str!! = str 评估运算符两侧的字符串是否不同。
字符串上的逻辑操作 说明
bool && bool 此运算符是一个逻辑 AND。在评估复合表达式的分量时,由与连接的所有分量都必须计算为 TRUE。下面是一个示例:http.req.method.eq(GET) && http.req.url.query.contains(“viewReport && my_pagelabel”)
bool || bool 此运算符是一个逻辑 OR。计算复合表达式的组件时,如果属于 OR 的表达式的任何组件的计算结果为 TRUE,则整个表达式为 TRUE。以下是一个例子:http.req.url.contains(“.js”) || http.res.header.(“Content-Type”)。Contains(“javascript”)
bool 对表达式执行逻辑“NOT”。

数字的复合操作

您可以配置复合数字表达式。例如,以下表达式返回一个数值,该值是 HTTP 标头长度和 URL 长度的总和:

http.req.header.length + http.req.url.length

下表介绍了可用于为数字数据配置复合表达式的运算符。

数字上的算术运算 说明
num + num 将运算符的左表达式值添加到右侧的表达式值。示例:http.req.content_length + http.req.url.length
num – num 从左表达式值中减去运算符的右表达式值。
Num x num 将运算符的左表达式值与右表达式值乘以右表达式值。示例:client.interface.rxthroughput * 9
num / num 将运算符的左表达式值除以右表达式值。
num % num 计算运算符左侧表达式的值除以右侧表达式的值的模数或余数。例如,值 “15 mod 4” 等于 3,而 “12 mod 4” 等于 0。
number 在应用数字的按位逻辑否定后返回一个数字。以下示例假定 numeric.expression 返回 12(二进制 1100):~numeric.expression。应用〜运算符的结果是-11(一个二进制 1110011,总共 32 位,所有运算符都在左边)。在应用运算符之前,所有小于 32 位的返回值都隐式地向左侧有零以使它们宽 32 位。
number ^ number 比较两个相等长度的位模式,并对每个数字参数中的每对相应位执行 XOR 操作,如果位不同,则返回 1;如果它们相同,则返回 0。将按位异 OR 应用于整数参数和当前数值后返回一个数字。如果按位比较中的值相同,则返回的值为 0。以下示例假定 numeric.expression1 返回 12(二进制 1100),numeric.expression2 返回 10(二进制 1010):numeric.expression1 ^ numeric.expression2 将 ^ 运算符应用于整个表达式的结果是 6(二进制 0110)。在应用运算符之前,所有小于 32 位的返回值都隐式地向左侧有零以使它们宽 32 位。
number | number 将按位 OR 应用于数值值后返回一个数字。如果按位比较中的任一值为 1,则返回的值为 1。以下示例假定 numeric.expression1 返回 12(二进制 1100),numeric.expression2 返回 10(二进制 1010):numeric.expression1 | numeric.expression2 将 | 运算符应用于整个表达式的结果是 14(二进制 1110)。在应用运算符之前,所有小于 32 位的返回值都隐式地向左侧有零以使它们宽 32 位。
number & number 比较两个相等长度的位模式并对每对对应的位执行按位 AND 运算,如果两个位都包含 1 的值,则返回 1;如果任一位都为 0,则返回 0。以下示例假定 numeric.expression1 返回 12(二进制 1100),numeric.expression2 返回 10(二进制 1010):numeric.expression1 & numeric.expression2 整个表达式计算为 8(二进制 1000)。在应用运算符之前,所有小于 32 位的返回值都隐式地向左侧有零以使它们宽 32 位。
num « num 根据右侧数字参数位数,返回数字值按位左移后的数字。移动的位数是整数模 32。以下示例假设 numeric.Expression1 返回 12(二进制 1100),数字 .表达式2 返回 3:numeric.Expression 1 « numeric.Expression 2 应用 LSHIFT 运算符的结果是 96(二进制 1100000)。在应用运算符之前,所有小于 32 位的返回值都隐式地向左侧有零以使它们宽 32 位。
num » num 返回数值按位右移位数的整数参数位数后的数字。移动的位数是整数模 32。以下示例假定 numeric.expression1 返回 12(二进制 1100),numeric.expression2 返回 3:numeric.expression1 » numeric.expression2 应用 RSIFT 运算符的结果是 1(二进制 0001)。在应用运算符之前,所有小于 32 位的返回值都隐式地向左侧有零以使它们宽 32 位。

| 产生 TRUE 或 FALSE 结果的数字运算符 | 说明 | | ———– | —————————————————————————————————————————————— | | num == num | 确定运算符左侧表达式的值是否等于右侧表达式的值。 | | Num!= num | 确定运算符左侧表达式的值是否不等于右侧表达式的值。 | | num > num | 确定运算符左侧表达式的值是否大于右侧表达式的值。 | | num < num | 确定运算符左侧表达式的值是否小于右侧表达式的值。 | | num >= num | 确定运算符左侧表达式的值是否大于或等于右侧表达式的值。| | num <= num | 确定运算符左侧表达式的值是否小于或等于右侧表达式的值 |

策略基础结构中数据类型的函数

Citrix ADC 策略基础结构支持以下数值数据类型:

  • 整数 (32 位)
  • 无符号长 (64 位)
  • 双精度 (64 位)

简单表达式可以返回所有这些数据类型。此外,您可以创建使用算术运算符和逻辑运算符来计算或返回这些数据类型的值的复合表达式。此外,您可以在策略表达式中使用所有这些值。可以通过将字符串 ul 附加到数字来指定无符号 long 类型的文字常量。double 类型的文字常量包含句点 (.)、指数或两者。

算术运算符、逻辑运算符和类型提升

在复合表达式中,以下标准算术和逻辑运算符可用于双精度和无符号长数据类型:

  • +、-、* 和/
  • %、~、^、&、|、« 和 »(不适用于双倍)
  • ==,!=、>、<、>= 和 <=

所有这些运算符都与 C 编程语言具有相同的含义。

在整数、无符号长和双精度类型的操作数之间进行混合运算的所有情况下。完成类型提升是为了对同一类型的操作数进行操作。该操作将较低优先级类型提升为具有最高优先级类型的操作数。优先级顺序(从高到低)如下所示:

  • 双倍
  • 无签名长
  • 整数

因此,返回数字结果的操作将返回该操作所涉及的最高类型的结果。

例如,如果操作数类型为整型和无符号长度,则整型操作数会自动转换为无符号长度类型。这种类型转换是在简单表达式中完成的。表达式前缀标识的数据类型与作为参数传递给函数的数据类型不匹配。在 HTTP.REQ.CONTENT_LENGTH.DIV (3UL) 操作中,前缀 HTTP.REQ.CONTENT_LENGT_LENGH 返回一个变为无符号长度的整数。无符号 long:作为参数传递给 DIV () 函数的数据类型,完成无符号长分割。同样,可以在表达式中推广论点。例如,HTTP.REQ.HEADER (“myHeader”) .TYPECAST_DOUBE_AT.DIV (5) 将整数 5 提升为双精度并执行双精度除法。

有关将一种类型的数据转换为另一种类型的数据的表达式的信息,请参阅 打字转换数据

复合高级策略表达式