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。

有时,NetScaler 配置实用程序会在“添加表达式”对话框中提供 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 (“我的头”) == http.res.header (“我的头”)
str <= str 评估运算符左侧的字符串是否与右边的字符串相同,还是按字母顺序排在前面。
str >= str 评估运算符左侧的字符串是否与右侧的字符串相同,还是按字母顺序跟随它。
str < str 评估运算符左侧的字符串是否按字母顺序排列在右侧的字符串之前。
str > str 评估运算符左侧的字符串是否按字母顺序跟随右侧的字符串。
str !!= str 评估运算符两侧的字符串是否不同。
字符串上的逻辑运算 说明
bool & bool 此运算符是一个逻辑 AND。在计算复合表达式的组件时,由 AND 连接的所有组件的计算结果必须为 TRUE。以下是一个示例:http.req.method.eq (GET) && http.req.url.query.contains (“查看报告 && 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*num 将运算符左侧表达式的值与右侧表达式的值相乘。以下是一个示例:client.interface.rxthroughput* 9
num / num 将运算符左侧的表达式的值除以右侧表达式的值。
num % num 计算运算符左侧表达式的值除以右侧表达式的值的模数或余数。例如,值“15 模组 4”等于 3,“12 模组 4”等于 0。
number 在对数字应用按位逻辑否定后返回一个数字。以下示例假定 numeric.expression 返回 12(二进制 1100):~numeric.expression。应用〜运算符的结果是-11(一个二进制 1110011,总共 32 位,所有运算符都在左边)。请注意,在应用运算符之前,所有返回的小于 32 位的值都隐式地在左侧有零,使其宽度为 32 位。
number ^ number 比较两个相等长度的位模式,并对每个数字参数中的每对对应位执行 XOR 运算,如果两个位不同则返回 1,如果相同则返回 0。将按位异或应用于整数参数和当前数字值后返回一个数字。如果按位比较中的值相同,则返回值为 0。以下示例假定 numeric.expression1 返回 12(二进制 1100),numeric.expression2 返回 10(二进制 1010):numeric.expression1 ^ numeric.expression2 将 ^ 运算符应用于整个表达式的结果是 6(二进制 0110)。请注意,在应用运算符之前,所有返回的小于 32 位的值都隐式地在左侧有零,使其宽度为 32 位。
number | number 对数字值应用按位或后返回一个数字。如果按位比较中的任一值为 1,则返回值为 1。以下示例假定 numeric.expression1 返回 12(二进制 1100),numeric.expression2 返回 10(二进制 1010):numeric.expression1 | numeric.expression2 将 | 运算符应用于整个表达式的结果是 14(二进制 1110)。请注意,在应用运算符之前,所有返回的小于 32 位的值都隐式地在左侧有零,使其宽度为 32 位。
number & number 比较两个相等长度的位模式,并对每对对应的位执行按位与运算,如果两个位都包含值 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),数字 .expression2 返回 3:数字。表达式 1 « 数字。表达式 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 | 确定运算符左侧表达式的值是否小于或等于右侧表达式的值 |

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

NetScaler 策略基础架构支持以下数字数据类型:

  • 整数(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 提升为双精度并执行双精度除法。

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

复合高级策略表达式