复合高级策略表达式

您可以配置包含布尔运算符或算术运算符以及多个原子运算符的高级策略表达式。以下复合表达式包含一个布尔 AND:

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

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

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

复合表达式可以包含任意数量的逻辑运算符和算术运算符。以下表达式根据 HTTP 请求的 URL 和 cookie 评估 HTTP 请求的长度,评估标头中的文本,并对这两个结果执行布尔 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。

  • !.

    对表达式执行逻辑“NOT”。

在某些情况下,Citrix ADC 配置实用程序会在“添加表达式”对话框中提供 AND、“非”和“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 地址值。下面是一个示例:client.ip.dst + http.req.url.hostname
str1 ALT str2 使用从运算符任一侧的表达式派生的 string1 或 string2 值,只要这两个表达式都不是复合表达式。下面是一个示例:http.req.hostname alt client.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。在评估复合表达式的组件时,如果由或连接的表达式的任何组件的计算结果为 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 * num 将运算符左侧的表达式值与右侧的表达式值相乘。下面是一个示例:client.interface.rxthroughput * 9
num / num 将运算符左侧表达式的值除以右侧表达式的值。
num % num 计算运算符左侧表达式的值除以右侧表达式的值的模数或余数。例如,值“15 mod 4”等于 3,“12 mod 4”等于 0。
number 在应用数字的按位逻辑否定后返回一个数字。以下示例假定数字。表达式返回 12(二进制 1100):〜数字。表达式。应用〜运算符的结果是-11(一个二进制 1110011,总共 32 位,所有运算符都在左边)。请注意,在应用运算符之前,所有小于 32 位的返回值都隐式向左侧有零,使其宽度为 32 位。
number ^ number 比较两个相等长度的位模式,并对每个数字参数中的每对相应位执行 XOR 操作,如果位不同,则返回 1;如果它们相同,则返回 0。将按位异 OR 应用于整数参数和当前数值后返回一个数字。如果按位比较中的值相同,则返回的值为 0。以下示例假定数字 .Expression1 返回 12(二进制 1100),而数字。表达式 2 返回 10(二进制 1010):数字。表达式 1 ^ 数字。表达式 2 将 ^ 运算符应用于整个表达式的结果是 6(二进制 0110)。请注意,在应用运算符之前,所有小于 32 位的返回值都隐式向左侧有零,使其宽度为 32 位。
number | number 将按位 OR 应用于数值值后返回一个数字。如果按位比较中的任一值为 1,则返回的值为 1。以下示例假定数字 .表达式1 返回 12(二进制 1100),而数字 .表达式 2 返回 10(二进制 1010):数字 .表达式 1 | 数字. 表达式 2 将 | 运算符应用于整个表达式的结果是 14(二进制 1110)。请注意,在应用运算符之前,所有小于 32 位的返回值都隐式向左侧有零,使其宽度为 32 位。
number & number 比较两个相等长度的位模式,并对每对应位执行按位 AND 操作,如果两个位都包含值为 1,则返回 1;如果任一位都为 0,则返回 0。以下示例假定数字 .表达式1 返回 12(二进制 1100),并且数字 .表达式 2 返回 10(二进制 1010):数字 .表达式 1 和数字。表达式 2 整个表达式计算为 8(二进制 1000)。请注意,在应用运算符之前,所有小于 32 位的返回值都隐式向左侧有零,使其宽度为 32 位。
num « num 根据右侧数字参数位数,返回数字值按位左移后的数字。请注意,移位的数量是整数模 32。以下示例假定数字 .Express 1 返回 12(二进制 1100),而数字 .Expression2 返回 3:数字。表达式 1 « 数字。表达式 2 应用 LSHIFT 运算符的结果是 96(二进制 1100000)。请注意,在应用运算符之前返回的所有小于 32 位的值隐式的左侧有零,使它们变得 32 位宽。
num » num 返回数值按位右移位数的整数参数位数后的数字。请注意,移位的数量是整数模 32。以下示例假定数字 .表达式 1 返回 12(二进制 1100),数字 .表达式 2 返回 3:数字 .表达式 1 » 数字。表达式 2 应用 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 类型的文字常量包含句点 (.)、指数或两者。

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

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

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

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

在整数类型、无符号长和 double 类型的操作数之间的所有混合操作的情况下,都会执行类型提升,以便可以对相同类型的操作数执行操作。较低优先级的类型会自动提升为操作中涉及的优先级最高的操作数类型。优先级顺序(从高到低)如下所示:

  • 双倍
  • 无签名长
  • 整数

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

例如,如果操作数类型为整型和无符号长度,则整型操作数会自动转换为无符号长度类型。即使在简单的表达式中,表达式前缀标识的数据类型与作为参数传递给函数的数据类型不匹配,也会执行此类型转换。为了说明这样的示例,在 HTTP.REQ.CONTENT_LIGHT(3ul) 操作中,由前缀 HTTP.REQ.CONTENT_LIGHT 返回的整数将自动转换为无符号长(作为参数传递给 DIV() 函数的数据类型),并执行无符号长除法。同样,可以在表达式中推广论点。例如,HTTP.REQ.HEADER(“myHeader”).TYPECAST_DOUBLE_AT.DIV(5) 将整数 5 提升为类型双精度并执行双精度除法。

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