# SIP 规则表达式构建器

通过 AND、OR、NOT 和括号分组，可以使用子表达式构建器来根据子表达式构建复杂的规则条件。当您应用更改时，规则构建器将对规则进行验证。如果找到未配对的括号以及不支持的逻辑运算符，那么将发出警报。

要查看此管理控制台页面，请单击服务器 > 服务器类型 > 随需应变路由器 > odr_name > SIP 随需应变路由器设置 > 路由策略 SIP 规则 > 添加 > 子表达式构建器。

要使用规则构建器来修改规则，您必须拥有管理员管理特权。

## 选择操作数

### 路由和服务策略操作数

根据所选协议的不同，将显示不同的操作数。下表列示了控制台中显示的操作数名称、表达式中出现的实际操作数、每个操作数的有效协议以及每个操作数的描述。

表 1. 操作数。下表描述控制台中显示的操作数名称
请求变量 | 有效协议 | 描述
--- | --- | ---
`application` | IIOP | 包含 EJB 的企业应用程序的名称。
`clienthost` | HTTP SOAP IIOP SIP | 标准客户机主机名。这是因特网协议（IP）命令主机名的值。此操作数不支持 `>、>=、< 和 <=` 之类的数字运算符。
`clientport` | IIOP | 客户机端口名称。
`clientipv4` | HTTP SOAP SIP | 客户机的 IP 地址，使用因特网协议版本 4（IPv4） 点分四段地址类型 `n.n.n.n`。
`clientipv6` | HTTP SOAP SIP | 因特网协议版本 6（IPv6）128 位地址类型 `x:x:x:x:x:x:x:x`，符合客户机的 Request for Comments 1924（RFC 1924）。
`联系人头` | SIP | “联系人”头字段。
`Contact URI` | SIP | “联系人”头字段的 URI。
`cookie$<name>` | HTTP SOAP | cookie 名称。例如，表达式 `cookie$My_Cookie_Name='My_Cookie_Value'` 会测试请求，以了解它是否包含名为 `My_Cookie_Name` 并且值为 `My_Cookie_Value` 的 cookie。要测试特定 cookie 是否存在，请使用下列其中一个表达式：
    cookie$MyCookieName IS NOT NULL
    cookie$MyCookieName IS NULL
`ejbmodule` | IIOP | EJB 的模块名称。
`ejbname` | IIOP | EJB 的名称。
`ejbmethod` | IIOP | EJB 内的方法的名称。
`From header` | SIP | “源”头字段。
`From header display name` | SIP | “源”头字段中的显示名称。
`From URI` | SIP | “源”头字段的 URI。
`源 URI 主机` | SIP | “源”头字段中的主机。
`源 URI 端口` | SIP | “源”头字段的 URI 中的端口。
`源 URI 用户` | SIP | “源”头字段中的用户。
`header$<name>` | HTTP SOAP SIP | 头的名称或值。例如，表达式 `header$Host='localhost'` 会测试请求以了解它是否包含值为 `localhost` 的 HTTP 主机头。要测试主机头是否存在，请使用下列其中一个表达式：
    header$Host IS NOT NULL
    header$Host IS NULL
`HTTPMethod` | HTTP SOAP | 请求的 HTTP 方法。可能的值包括 POST、GET、PUT 和 DELETE。
`MIMEType` | HTTP SOAP | 请求的 MIME 类型。
`operation` | SOAP | Web service 操作的名称。
`percentage$<val>` | HTTP SOAP IIOP SIP | 百分比操作数对时间的固定百分比求值为 `true`。例如，`percentage$50` 对时间的平均值 50% 求值为 `true`。
`port` | HTTP SOAP IIOP SIP | 接收到请求的侦听端口。
`protocol` | HTTP SOAP | 传送请求的通信协议。当前支持的协议包括 HTTP、HTTPS、SOAP 和 SOAPS。
`queryparm$<name>` | HTTP SOAP | 头的名称或值。例如，表达式 `queryparm$timezone='EST'` 测试请求以了解该请求是否包含名为 `timezone` 并且值为 `EST` 的 HTTP 查询参数。要测试查询参数是否存在，请使用下列其中一种格式：
    queryparm$timezone IS NOT NULL
    queryparm$timezone IS NULL
`rampup$<startTime>$<completionTime>` | HTTP SOAP IIOP SIP | rampup 操作数对时间的可变百分比求值为 `true`。它在 `<startTime>` 之前一直求值为 `false`，在 `<completionTime>` 之后一直求值为 `true`。从 `<startTime>` 至 `<completionTime>` 的时间内，它对线性增长的百分比求值为 `true`。 `<startTime>` 和 `<completionTime>` 的格式为 `day/month/year::hour:min:sec`。 其中 day 表示月份中的日期，month 表示月份（Jan、Feb、Mar、Apr、May、Jun、Jul、Aug、Sep、Oct、Nov 和 Dec），year 是用 4 位数字表示的年份，hour 是用 2 位数字表示的 24 小时制的小时，min 和 sec 分别是用 2 位数字值表示的分钟和秒。 例如， `rampup$01/Jan/2007::08:00:00$01/Jan/2007::17:00:00` 开始在 2007 年 1 月 1 日上午 8 点偶然求值为 `true`，并且在同一天的下午 5 点 ramp up 完成时一直求值为 `true`。
`Request transport` | SIP | The transport of the request.
`Request URI` | SIP | 请求 URI。
`请求 URI 主机` | SIP | 请求 URI 中的主机。
`请求 URI 端口` | SIP | 请求 URI 中的端口。
`Request URI user` | SIP | 请求 URI 中的用户。
`Scheme of From header` | SIP | “源”头字段的模式。
`Scheme of To header` | SIP | “目标”头字段的模式。
`Scheme of URI` | SIP | URI 的模式。
`serverhost` | HTTP SOAP IIOP SIP | 服务器的标准主机名。此操作数不支持 `>、>=、< 和 <=` 之类的数字运算符。
`serveripv4` | HTTP SOAP SIP | 服务器的 IP 地址，使用 IPv4 点分四段地址类型 `n.n.n.n`。
`serveripv6` | HTTP SOAP SIP | IPv6 128 位地址类型 `x:x:x:x:x:x:x:x`，遵循服务器的 RFC 1924 协议。
`service` | SOAP | Web service 的名称。
`SIP method` | SIP | 请求的 SIP 方法。可能的值包括 INVITE、TRYING、RINGING、ACK、OK 和 BYE。如果消息并非请求，那么此操作数返回 NULL。
`SIP response code` | SIP | 响应的响应代码。如果消息并非响应，那么此操作数返回 -1。
`time` | HTTP SOAP IIOP | 此操作数用于定义必须处理给定请求的当日的日期和时间。两个可选字段是 StartTime 和 EndTime。如果在该已定义窗口外接收到请求，那么不会处理该请求。 “开始时间和结束时间”字段都必须使用以下格式：`dayOfWeek/dayOfMonth/month/year::hour:minute:second`。 例如，2007 年 4 月 11 日下午 1:03:45 指定为： Thu/11/Apr/2007::13:03:45 任何字段都可使用值为 * 的通配符。例如，每个月的第一天指定为 */1。 dayofWeek 值为 Sun、Mon、Tue、Wed、Thu、Fri、Sat，而 dayOfMonth 值的范围是 1 到 31。 month 值是表示 12 个月的非数字值：Jan、Feb、Mar、Apr、May、Jun、Jul、Aug、Sep、Oct、Nov 和 Dec。 year 值由表示年份的四位数字组成。例如，2007。 hour 值是以 24 小时制表示的当天小时。例如，8am 表示为 ::8。minute 和 second 是范围在 0 到 59 之间的整数。 正斜杠（/）用来分隔日期参数，双冒号（::）用来分隔日期和时间参数，冒号（:）用来分隔时间参数。请注意，由使用了 time 操作数的整个规则的布尔结果来确定要执行的路由操作。
`To client host` | SIP | “目标”头字段中的客户机主机。
`To header` | SIP | “目标”头字段。
`To header display name` | SIP | “目标”头字段中的显示名称。
`To URI` | SIP | “目标”头字段的 URI。
`目标 URI 主机` | SIP | “目标”头字段的 URI 中的端口。
`目标 URI 用户` | SIP | “目标”头字段中的用户。
`virtual host` | HTTP SOAP | 虚拟门户网站是在 WebSphere® Portal Server 中创建的，WebSphere Extended Deployment 支持此操作数以便更好地与 WebSphere Portal Server 集成。虚拟端口是请求 URL 减去 WebSphere Portal 应用程序的 Web 模块上下文根后的结果。如果给定的请求与所定义的虚拟门户网站匹配，那么将执行为该规则定义的路由操作。
`xpathexpr` | SOAP | XPath 字符串表达式具有用于包含 XPath 表达式的必需字段和用于定义局部名称空间的可选字段。如果 XPath 表达式中包含的所有名称空间都是标准名称空间，那么第二个字段是可选字段。如果有多个局部名称空间，那么请使用逗号（,）进行分隔。以下是包含一个局部名称空间定义的 xpathexpr 示例：
    xpathexpr$/soap:Envelope/soap:Body/m:getTimeZone/n:clientId$m\\=http://test.classify.ws.ibm.com,n\\=http://test2.classify.ws.ibm.com
    = \\'1000\\' or operation IS NOT NULL
在先前表达式中，XPath 表达式为 `/soap:Envelope/soap:Body/n:getTimeZone/n:clientId`。它包含局部名称空间 `n`。所以，xpathexpr 的第二个字段定义为 `n \\=http://test.classify.ws.ibm.com`。美元符号（$）用于指示字段定义的开始。两个反斜杠在此示例中是转义序列。第一个等号（=）已转义，原因是它包括在局部名称空间定义中，而第二个等号（=）是分类表达式中的运算符，不能进行转义。 以下是包含两个局部名称空间的 xpathexpr 示例：
    xpathexpr$/soap:Envelope/soap:Body/m:getTimeZone/n:clientId$m\\=http://test.classify.ws.ibm.com,n\\=http://test2.classify.ws.ibm.com
    = \\'1000\\' or operation IS NOT NULL
以下是 xpathexpr 的标准名称空间列表：
表 1. 名称空间。下表中描述了标准名称空间
名称空间 | URL
--- | ---
soap | http://schemas.xmlsoap.org/soap/envelope/
soap-env | http://schemas.xmlsoap.org/soap/envelope/
soapenc | http://schemas.xmlsoap.org/soap/encoding/
soapbind | http://schemas.xmlsoap.org/wsdl/soap/
xsd | http://www.w3.org/2001/XMLSchema
xsi | http://www.w3.org/2001/XMLSchema-instance
xsi | http://ws-i.org/schemas/conformanceClaim/
wsdl | http://schemas.xmlsoap.org/wsdl/

## 运算符

- =：“等于”运算符表示以区分大小写方式进行匹配。
- <>：“不等于”运算符表示操作数值与输入的值不相等。
- >：“大于”运算符适用于数字。
- >= ：“大于或等于”运算符适用于数字。
- < ：“小于”运算符适用于数字。
- <=：“小于或等于”运算符适用于数字。
- AND：对于 `xx` AND `yy`，表示与既包含 `xx` 又包含 `yy` 的内容匹配。
- BETWEEN：通过将此运算符与 AND 运算符配合使用，可以选择一系列值，包括第一个值（最小值）和最后一个值（最大值）。这两个运算符可以共同对数字和日期执行运算。
- EXISTS：此布尔运算符对操作数或复合子表达式的结果进行检查，例如，检查某些 HTTP 头元素属性。
- IN：此运算符表示在单个表达式中包含多个值的操作数。例如，对于名为 `port` 的操作数，如果要表示端口值可以是任何值或所有值，例如 `9080`、`9090` 和 `9091`，那么表达式片段为 `port IN (9080,9090,9091)`。括号中值的表示方式取决于端口的数据类型。如果端口是整数，那么正确的语法是一些不带引号的值。如果端口是字符串，那么正确的语法是 `port IN ('9080', '9090', '9091')`。
- IS NULL：此运算符表示查询验证结果表明所请求的参数不存在。
- IS NOT NULL：此运算符表示查询验证结果表明所请求的参数存在。
- LIKE：此运算符表示对字符串操作数值进行模式匹配。在模式匹配的开始位置，值必须包含百分号通配符（%）。例如，表达式 `host LIKE %blanca` 表示与单词 blanca 或者任何其他以 blanca 结尾的单词匹配；表达式 `host LIKE blanca%` 表示与单词 blanca 或者任何其他以 blanca 开头的单词匹配；表达式 `host LIKE %blanca%` 表示与单词 blanca 或者任何嵌入了 blanca 的单词匹配。
- NOT：对于 NOT `xx`，此运算符表示未包含 `xx` 的匹配项。
- OR：对于 `xx` OR `yy`，此运算符表示包含 `xx` 或 `yy` 的匹配项。

## 值

根据所选运算符的不同，输入要创建的子表达式的值。

## 生成子表达式

根据已指定的操作数、运算符和值，生成子表达式。

## 追加

单击以追加至规则面板上的框。

相关信息：
路由策略 SIP 规则
服务策略 SIP 规则

文件名：sip_rulebuilder_detail.html