AppExpert

在表达式中指定字符集

Citrix ADC 设备上的策略基础结构支持 ASCII 和 UTF-8 字符集。默认字符集是 ASCII。如果要为其配置表达式的流量仅包含 ASCII 字符,则无需在表达式中指定字符集。设备允许包含二进制字符的所有字符串和字符文本。但是,UTF-8 字符集仍需要字符串和字符文本为有效的 UTF-8。

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

在表达式中,必须在表达式中的点引入 SET_CHAR_SET () 函数,之后必须在指定的字符集中执行数据处理。例如,在表达式 HTTP.REQ.BOYE (1000) 中,如果存储在模式集“希腊字母”中的字符串在 UTF-8 中,则必须包含 SET_Char_SET (UTF_8) 函数紧接在包含 S_any (”<string>“) 函数之前,如下所示:

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) 函数。在上面第一段之后的第二个示例中,如果传递给后面的 ASCII 参数更改为 UTF-8 字符串,则可以在身体 (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)

但是,在处理复合表达式时,就在评估“等于”布尔运算符之前,Citrix ADC 设备会将 HTTP.REQ.HITAL(“MySheader”)返回的值的字符集提升为 UTF-8。

以下示例中的第一个简单表达式评估 ASCII 字符集中的数据。但是,当 Citrix ADC 设备处理复合表达式时,在连接两个简单表达式的结果之前,该设备会将 HTTP.REQ.BOTY (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。下面是一个复合表达式的示例,该示例首先检查请求的“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)设置到 Citrix ADC 设备的连接时,必须设置将数据传输到 UTF-8 的字符集。

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

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

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