ADC

关于文本表达式

您可以配置各种表达式来处理流经 NetScaler 设备的文本。以下是如何使用高级策略表达式解析文本的一些示例:

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

    例如,您可能希望识别包含特定 Accept-Language 标头的 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")

在前面的示例中,contains 运算符允许部分匹配,而 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/)

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

关于文本表达式