ADC

在表达式中指定字符集

NetScaler 设备上的策略基础架构支持 ASCII 和 UTF-8 字符集。默认字符集是 ASCII。如果您正在配置表达式的流量仅包含 ASCII 字符,则无需在表达式中指定字符集。该设备允许使用所有包含二进制字符的字符串和字符文字。但是,UTF-8 字符集仍然要求字符串和字符文字是有效的 UTF-8。

CLIENT.TCP.PAYLOAD(100).CONTAINS("\xff\x02")

在表达式中,必须在表达式中引入 SET_CHAR_SET () 函数,之后必须使用指定的字符集进行数据处理。例如,在表达式 HTTP.REQ.BODY(1000).AFTER_REGEX(re/following example/).BEFORE_REGEX(re/In the preceding example/).CONTAINS_ANY(“Greek_ alphabet”) 中,如果存储在模式集“Greek_alphabet”中的字符串为 UTF-8 格式,则必须立即在 CONTAINS_ANY(“<string>”) 函数之前包括 SET_CHAR_SET(UTF_8),如下所示:

HTTP.REQ.BODY(1000).AFTER_REGEX(re/following example/).BEFORE_REGEX(re/In the preceding example/).SET_CHAR_SET(UTF_8).CONTAINS_ANY("Greek_ alphabet")

SET_CHAR_SET () 函数为表达式中的所有进一步处理(即所有后续函数)设置字符集,除非该字符集稍后在表达式中被另一个更改字符集的 SET_CHAR_SET () 函数覆盖。因此,如果给定简单表达式中的所有函数都用于 UTF-8,则可以在识别文本的函数(例如 HEADER(“<name>”) 或 BODY(<int>) 函数)之后立即包括 SET_CHAR_SET(UTF_8) 函数。在上面第一段之后的第二个示例中,如果传递给 AFTER_REGEX () 和 BEFORE_REGEX () 函数的 ASCII 参数更改为 UTF-8 字符串,则可以在 BODY (1000) 函数之后立即加入 SET_CHAR_SET (UTF_8) 函数,如下所示:

HTTP.REQ.BODY(1000).SET_CHAR_SET(UTF_8).AFTER_REGEX(re/Bücher/).BEFORE_REGEX(re/Wörterbuch/).CONTAINS_ANY("Greek_alphabet")

UTF-8 字符集是 ASCII 字符集的超集,因此,如果您将字符集更改为 UTF-8,则为 ASCII 字符集配置的表达式将继续按预期工作。

具有不同字符集的复合表达式

在复合表达式中,如果将表达式的一个子集配置为处理 ASCII 字符集中的数据,而其余表达式配置为处理 UTF-8 字符集中的数据,则在单独评估表达式时会考虑为每个单个表达式指定的字符集。但是,在处理复合表达式时,就在处理运算符之前,设备会将返回的 ASCII 值的字符集升级为 UTF-8。例如,在以下复合表达式中,第一个简单表达式计算 ASCII 字符集中的数据,而第二个简单表达式评估 UTF-8 字符集中的数据:

HTTP.REQ.HEADER("MyHeader") == HTTP.REQ.BODY(10).SET_CHAR_SET(UTF_8)

但是,在处理复合表达式时,就在计算“等于”布尔运算符之前,NetScaler 设备将 HTTP.REQ.HEADER(“myHeader”)返回值的字符集升级为 UTF-8。

以下示例中的第一个简单表达式计算 ASCII 字符集中的数据。但是,当 NetScaler 设备处理复合表达式时,就在连接两个简单表达式的结果之前,设备会将 HTTP.REQ.BODY (10) 返回值的字符集升级为 UTF-8。

HTTP.REQ.BODY(10) + HTTP.REQ.HEADER("MyHeader").SET_CHAR_SET(UTF_8)

因此,复合表达式返回 UTF-8 字符集的数据。

根据流量的字符集指定字符集

您可以根据流量特征将字符集设置为 UTF-8。如果您不确定正在评估的流量的字符集是否为 UTF-8,则可以配置一个复合表达式,其中第一个表达式检查 UTF-8 流量,后续表达式将字符集设置为 UTF-8。以下是复合表达式的示例,该表达式首先检查请求的 Content-Type 标头中“charset”的值是否为“UTF-8”,然后检查请求中的前 1000 字节是否包含 UTF-8 字符串 Bücher:

HTTP.REQ.HEADER("Content-Type").SET_TEXT_MODE(IGNORECASE).TYPECAST_NVLIST_T('=', '; ', '"').VALUE("charset").EQ("UTF-8") && HTTP.REQ.BODY(1000).SET_CHAR_SET(UTF_8).CONTAINS("Bücher")

如果您确定要评估的流量的字符集为 UTF-8,则示例中的第二个表达式就足够了。

表达式中的字符和字符串文字

在表达式评估期间,即使当前字符集为 ASCII,分别用单引号 (‘’) 和引号 (“”) 括起来的字符文字和字符串文字也被视为 UTF-8 字符集中的文字。在给定表达式中,如果函数对 ASCII 字符集中的字符或字符串文字进行操作,并且在文字中包含非 ASCII 字符,则会返回错误。

注意

现在,高级策略表达式中的字符串文字与策略表达式一样长。该表达式的长度允许为 1499 字节或 8191 字节。

十六进制和八进制格式的值

配置表达式时,可以输入八进制和十六进制格式的值。但是,每个十六进制或八进制字节都被视为 UTF-8 字节。无论值是手动输入还是从剪贴板粘贴,无效的 UTF-8 字节都会导致错误。例如,“\ xce\ x20”是无效的 UTF-8 字符,因为“c8”后面不能有“20”(多字节 UTF-8 字符串中的每个字节都必须设置高位)。无效 UTF-8 字符的另一个示例是“\ xce\ xa9”,因为十六进制字符由空格字符分隔。

返回 UTF-8 字符串的函数

只有 text>.XPATH<text>.XPATH_JSON 函数总是返回 UTF-8 字符串。以下 MYSQL 例程决定在运行时返回哪个字符集,具体取决于协议中的数据:

  • MYSQL_CLIENT_T.USER
  • MYSQL_CLIENT_T.DATABASE
  • MYSQL_REQ_QUERY_T.COMMAND
  • MYSQL_REQ_QUERY_T.TEXT
  • MYSQL_REQ_QUERY_T.TEXT(<unsigned int>)
  • MYSQL_RES_ERROR_T.SQLSTATE
  • MYSQL_RES_ERROR_T.MESSAGE
  • MYSQL_RES_FIELD_T.CATALOG
  • MYSQL_RES_FIELD_T.DB
  • MYSQL_RES_FIELD_T.TABLE
  • MSQL_RES_FIELD_T.ORIGINAL_TABLE
  • MYSQL_RES_FIELD_T.NAME
  • MYSQL_RES_FIELD_T.ORIGINAL_NAME
  • MYSQL_RES_OK_T.MESSAGE
  • MYSQL_RES_ROW_T.TEXT_ELEM(<unsigned int>)

UTF-8 的终端连接设置

当您使用终端连接(例如使用 PuTTY)设置与 NetScaler 设备的连接时,必须将用于传输数据的字符集设置为 UTF-8。

高级策略表达式中的最小和最大函数

高级策略表达式支持以下最小和最大函数。

  1. (<expression1>.max(<expression2>) -返回两个值中的最大值。
  2. (<expression1>.min(<expression2>) -返回两个值中的最小值。