关于文本表达式
您可以配置各种表达式来处理流经Citrix ADC设备的文本。以下是如何使用高级策略表达式解析文本的一些示例:
确定是否存在特定的HTTP标头。
例如,您可能希望识别包含特定接收语言标头的HTTP请求,以便将请求定向到特定服务器。
确定特定HTTP url是否包含特定字符串。
例如,您可能想阻止对特定url的请求。请注意,该字符串可以出现在另一个字符串的开头、中间或结尾处。
确定定向到特定应用程序的post请求。
例如,为了刷新缓存的应用程序数据,您可能希望识别定向到数据库应用程序的所有post请求。
请注意,有专门的工具可用于查看HTTP请求和响应的数据流。您可以使用这些工具查看数据流。
关于文本操作
基于文本的表达式至少包含一个用于标识数据元素的前缀,通常(尽管并非总是如此)对该前缀进行操作。基于文本的操作可以应用于请求或响应的任何部分。对文本的基本操作包括各种类型的字符串匹配。
例如,以下表达式将标头值与字符串进行比较:
http.req.header(“到了头”).contains(“文本”)
以下表达式是在请求中匹配文件类型的示例:
http.req.url.suffix.contains (jpeg)
http.req.url.suffix.eq (jpeg)
在前面的示例中,包含运算符允许部分匹配,而eq运算符则查找精确匹配。
在计算字符串之前,还有其他操作可用于格式化字符串例如,您可以使用文本操作去掉引号和空格、将字符串转换为全部小写或连接字符串。
注意:
复杂的操作可用于根据模式执行匹配或将一种类型的文本格式转换为另一种类型的文本格式。
有关详细信息,请参阅以下主题:
文本表达式中的混合和优先级
您可以应用各种运算符来组合文本前缀或表达式。例如,以下表达式将每个前缀的返回值连接起来:
http.req.hostname + http.req.url
以下是使用逻辑和的复合文本表达式的示例。要使请求与表达式匹配,此表达式的两个组件必须为true:
http.req.method.eq (post) & & http.req.body (1024) .startswith(“目的地= ")
注意:
有关复合运算符的详细信息,请参阅复合高级表达式。
文本表达式的类别
您可以配置的文本表达式的主要类别包括:
HTTP标头,HTTP url和HTTP请求中的post正文中的信息。
有关详细信息,请参阅HTTP请求和响应中文本的表达式前缀。
有关VPN或无客户端VPN的信息。
有关详细信息,请参阅VPN和无客户端VPN的表达式前缀。
TCP有效负载信息。
有关TCP有效负载表达式的更多信息,请参阅高级策略表达式:解析http, tcp和udp数据。
安全套接字层(ssl)证书中的文本。
有关SSL和SSL证书数据的文本表达式的信息,请参阅高级策略表达式:解析SSL证书和SSL证书日期的表达式。
注意:
解析文档正文(如post请求的正文)可能会影响性能。您可能需要测试评估文档正文的策略对性能的影响。
文本表达式的准则
从性能的角度来看,通常最好在表达式中使用协议感知函数。例如,以下表达式使用协议感知函数:
HTTP.REQ.URL.QUERY
上一个表达式的性能优于以下基于字符串解析的等效表达式:
HTTP.REQ.URL.AFTER_STR(“?”)
在第一种情况下,表达式专门查看url查询。在第二种情况下,表达式会扫描数据以查找第一次出现的问号。
文本的结构化解析也具有性能优势,如以下表达式所示:
HTTP.REQ.HEADER(“示例”).TYPECAST_LIST_T (', ') . get (1)
(有关打字转换的更多信息,请参阅打字转换数据。类型转换表达式收集逗号分隔的数据并将其结构化为列表,通常比以下非结构化等效表达式更好:
HTTP.REQ.HEADER(“示例”).AFTER_STR .BEFORE_STR (", ") (", ")
最后,非结构化文本表达式通常比正则表达式具有更好的性能。例如,以下是非结构化文本表达式:
HTTP.REQ.HEADER .AFTER_STR(“示例”)(“更多”)
前面的表达式通常比以下使用正则表达式的等效表达式提供更好的性能:
HTTP.REQ.HEADER(“示例”).AFTER_REGEX (re / /)
有关正则表达式的更多信息,请参阅正则表达式。