ADC

高级策略表达式的基本元素

高级策略表达式至少由一个前缀(或用来代替前缀的单个元素)组成。大多数表达式还指定要对前缀标识的数据执行的操作。您可以按如下方式格式化最多 1,499 个字符的表达式:

<prefix>.<operation> [<compound-operator> <prefix>.<operation>. . .]

其中

  • <prefix>

    是开始表达式的锚点。

    前缀是用句点分隔的密钥,用于标识数据单元。例如,以下前缀检查 HTTP 请求中是否存在名为 Content-Type 的标头:

    http.req.header(“Content-Type”)

    前缀也可以单独用于返回前缀标识的对象的值。

  • <operation>

    确定要对由前缀标识的数据执行的评估。

    例如,考虑以下表达式:

    http.req.header(“Content-Type”).eq(“text/html”)

    在此表达式中,以下是运算符组件:

    eq(“text/html”)

    此运算符使 NetScaler 评估包含内容类型标头的任何 HTTP 请求,特别是确定此标头的值是否等于字符串“text/html”。有关更多信息,请参阅“操作。“

  • <compound-operator>

    是一个布尔运算符或算术运算符,它由多个前缀或前缀.operation元素构成复合表达式。

    例如,考虑以下表达式:

    http.req.header(“Content-Type”).eq(“text/html”) && http.req.url.contains(“.html”)

前缀

表达式前缀表示一段离散的数据。例如,表达式前缀可以表示 HTTP URL、HTTP Cookie 标头或 HTTP POST 请求正文中的字符串。表达式前缀可以识别和返回各种数据类型,包括以下类型:

  • TCP/IP 数据包中的客户端 IP 地址
  • NetScaler 系统时间
  • 通过 HTTP 进行外部调用
  • TCP 或 UDP 记录类型

在大多数情况下,表达式前缀以以下关键字之一开头:

  • CLIENT:
    • 识别发送请求或接收响应的客户端的特征,如以下示例所示:
    • 前缀 client.ip.dst 表示请求或响应中的目标 IP 地址。
    • 前缀 client.ip.src 表示源 IP 地址。
  • HTTP:
    • 标识 HTTP 请求或响应中的元素,如以下示例所示:
    • 前缀 http.req.body(整数)将 HTTP 请求的主体指定为多行文本对象,直至指定为整数的字符位置。
    • 前缀 http.req.header(“header_name”) 指定 HTTP 标头,如 header_name 中指定的。
    • 前缀 http.req.url 指定 URL 编码格式的 HTTP URL。
  • SERVER:

    标识服务器中正在处理请求或发送响应的元素。

  • SYS:

    识别正在处理流量的 NetScaler 的特征。

    注意: 请注意,DNS 策略仅支持 SYS、客户端和服务器对象。

    此外,在 NetScaler Gateway 中,无客户端 VPN 功能可以使用以下类型的前缀:

  • TEXT:

    识别请求或响应中的任何文本元素。

  • TARGET:

    识别连接的目标。

  • URL;

    识别 HTTP 请求或响应的 URL 部分中的元素。

一般的经验法则,任何表达式前缀都可以是自包含的表达式。例如,以下前缀是一个完整的表达式,它返回字符串参数中指定的 HTTP 标头的内容(用引号括起来):

http.res.header.("myheader")

或者,您可以将前缀与简单操作相结合来确定 TRUE 和 FALSE 值。例如,以下内容返回 TRUE 或 FALSE 的值:

http.res.header.("myheader").exists

您还可以对表达式中的单个前缀和多个前缀使用复杂的运算,如以下示例所示:

http.req.url.length + http.req.cookie.length <= 500

您可以指定哪个表达式前缀取决于 NetScaler 功能。下表描述了每个功能中感兴趣的表达式前缀

功能 功能中使用的表达式前缀类型
DNS SYS、CLIENT、SERVER
保护功能中的响应者 HTTP、SYS、CLIENT
内容交换 HTTP、SYS、CLIENT
重写 HTTP、SYS、CLIENT、SERVER、URL、TEXT、TARGET、VPN
集成缓存 HTTP、SYS、CLIENT、SERVER
NetScaler Gateway,无客户端接入 HTTP、SYS、CLIENT、SERVER、URL、TEXT、TARGET、VPN

表 1. 各种 NetScaler 功能中允许的表达式前缀类型

注意: 有关功能中允许的表达式前缀的详细信息,请参阅该功能的文档。

单元素表达式

最简单的高级策略表达式包含单个元素。此元素可以是以下元素之一:

  • true。高级策略表达式可以简单地包含 true 的值。这种类型的表达式总是返回 TRUE 的值。它对于链接策略操作和触发 Goto 表达式很有用。
  • 假的。高级策略表达式可以只包含值 false。这种类型的表达式总是返回值 FALSE。
  • 复合表达式的前缀。例如,前缀 HTTP.REQ.HOSTNAME 是返回主机名的完整表达式,而 HTTP.REQ.URL 是返回 URL 的完整表达式。该前缀也可以与运算和其他前缀结合使用以形成复合表达式。

operations

在大多数表达式中,您还可以指定对前缀标识的数据的操作。例如,假设您指定了以下前缀:

http.req.url

此前缀提取 HTTP 请求中的 URL。此表达式前缀不需要在表达式中使用任何运算符。但是,当您配置处理 HTTP 请求 URL 的表达式时,可以指定分析 URL 特定特征的操作。以下是几种可能性:

  • 在 URL 中搜索特定的主机名。
  • 在 URL 中搜索特定路径。
  • 评估 URL 的长度。
  • 在 URL 中搜索表示时间戳的字符串并将其转换为 GMT。

以下是标识名为 Server 的 HTTP 标头的前缀和在标头值中搜索字符串 IIS 的操作的示例:

http.res.header("Server").contains("IIS")

以下是标识主机名的前缀和搜索字符串“www.mycompany.com”作为名称值的操作的示例:

http.req.hostname.eq("www.mycompany.com")

表达式前缀的基本操作

下表描述了可以对表达式前缀执行的一些基本操作。

操作 决定是否
CONTAINS() 该对象匹配 。以下是示例:http.req.header("Cache-Control").contains("no-cache")
EXISTS 特定项目存在于对象中。以下是示例:http.res.header(“MyHdr”).exists
EQ() 对象中存在特定的非数字值。以下是示例:http.req.method.eq(post)
EQ() 对象中存在特定的数值。以下是示例:client.ip.dst.eq(10.100.10.100)
LT() 对象的值小于特定值。以下是示例: http.req.content_length.lt(5000)
GT() 对象的值大于特定值。以下是示例:http.req.content_length.gt(5)

下表总结了几种可用的操作类型。

操作类型 说明
文本操作 将单个字符串和字符串集与目标的任何部分进行匹配。目标可以是整个字符串、字符串的开头或字符串开头和结尾之间的任何文本部分。例如,您可以从“xyzsomeText”中提取字符串“XYZ”。或者,您可以将 HTTP 标头值与由不同字符串组成的数组进行比较。您也可以将文本转换为另一种类型的数据。以下是示例:将字符串转换为整数值,从 URL 中的查询字符串创建列表,并将字符串转换为时间值。
数字运算 数值运算包括应用算术运算符、评估内容长度、列表中的项目数、日期、时间和 IP 地址。
高级策略表达式的基本元素