关于文本表达式

您可以配置各种表达式来处理流经 Citrix ADC 设备的文本。下面是如何使用默认语法表达式解析文本的一些示例:

  • 确定是否存在特定 HTTP 标头。

    例如,您可能需要标识包含特定接受语言标头的 HTTP 请求,以便将请求引导到特定服务器。

  • 确定特定 HTTP URL 包含特定字符串。

    例如,您可能希望阻止特定 URL 的请求。请注意,字符串可能出现在另一个字符串的开头、中间或结尾处。

  • 标识定向到特定应用程序的 POST 请求。

    例如,您可能需要标识定向到数据库应用程序的所有 POST 请求,以刷新缓存的应用程序数据。

请注意,有专门的工具可用于查看 HTTP 请求和响应的数据流。您可以使用这些工具查看数据流。

关于文本操作

基于文本的表达式至少由一个前缀组成,用于标识数据元素,并且通常(尽管并不总是)对该前缀执行操作。基于文本的操作可以应用于请求或响应的任何部分。对文本的基本操作包括各种类型的字符串匹配。

例如,以下表达式将标头值与字符串进行比较:

http.req.header("myHeader").contains("some-text")

以下表达式是在请求中匹配文件类型的示例:

http.req.url.suffix.contains("jpeg")

http.req.url.suffix.eq("jpeg")

在上述示例中,包含运算符允许部分匹配,eq 运算符会查找精确匹配。

其他操作可用于在评估字符串之前格式化字符串。例如,您可以使用文本操作去除引号和空格、将字符串转换为全部小写或连接字符串。

注意

复杂的操作可用于基于模式执行匹配或将一种类型的文本格式转换为另一种类型。

有关详细信息,请参阅以下主题:

文本表达式中的混合和优先级

您可以应用各种运算符来组合文本前缀或表达式。例如,以下表达式连接每个前缀的返回值:

http.req.hostname + http.req.url

下面是使用逻辑 AND 的复合文本表达式的示例。要使请求与表达式匹配,此表达式的两个组件必须为 TRUE:

http.req.method.eq(post) && http.req.body(1024).startswith("destination=")

注意:

有关混合运算符的更多信息,请参阅 复合高级表达式

文本表达式的类别

可以配置的文本表达式的主要类别为:

注意:

解析文档正文(如 POST 请求的正文)可能会影响性能。您可能需要测试评估文档正文的策略的性能影响。

文本表达式指南

从性能的角度来看,通常最好在表达式中使用协议感知函数。例如,以下表达式使用了协议感知函数:

HTTP.REQ.URL.QUERY

上一个表达式比以下基于字符串解析的等效表达式更好:

HTTP.REQ.URL.AFTER_STR("?")

在第一种情况下,表达式专门查看 URL 查询。在第二种情况下,表达式扫描数据是否首次出现问号。

文本的结构化解析也具有性能优势,如以下表达式所示:

HTTP.REQ.HEADER("Example").TYPECAST_LIST_T(',').GET(1)

(有关类型转换的更多信息,请参阅类型转换数据。类型转换表达式收集逗号分隔的数据并将其结构化为列表,通常比以下非结构化等效表达式更好:

HTTP.REQ.HEADER("Example").AFTER_STR(",").BEFORE_STR(",")

最后,非结构化文本表达式通常比正则表达式具有更好的性能。例如,下面是非结构化文本表达式:

HTTP.REQ.HEADER("Example").AFTER_STR("more")

前面的表达式通常比以下使用正则表达式的等效表达式提供更好的性能:

HTTP.REQ.HEADER("Example").AFTER_REGEX(re/more/)

有关正则表达式的更多信息,请参阅正则表达式