# 规则引擎
#### 使用场景
规则引擎功能通过图形化的方式实现各种规则配置，实现更加灵活、细粒度的规则配置。通过限制触发条件，控制当前配置生效的资源范围，满足多种场景的配置需求。主要适用于以下场景：
- CDN节点的相关配置不能满足特定的资源配置需求，如个别资源的访问控制条件与全局配置不同等场景。
 
#### 规则引擎与基础配置的关系
如果域名同时配置了规则引擎和基础配置，客户端请求的流程如[图1]。
图1规则引擎与基础配置的关系   
![](https://support.huaweicloud.com/usermanual-cdn/zh-cn_image_0000002743118498.png "点击放大")
#### 注意事项
- 单域名最多可配置10条规则。
- "业务类型"为"全站加速"的域名，暂不支持配置规则引擎。
- 后台有特殊配置的域名暂不支持配置规则引擎。
- 规则引擎功能和普通功能同时配置时，规则引擎优先级更高。
- 新增规则默认位于顶部，存在多条规则时顶部优先级大于底部，即如果同时匹配多条规则，高优先级的规则生效。
- 一个触发条件最多支持三级嵌套，最后一个层级的逻辑运算符只能是"并且"或"或者"，不能组合使用。
 
#### 操作步骤
1. 登录[CDN控制台](https://console.huaweicloud.com/cdn/?locale=zh-cn#/cdn/overview)。
2. 在左侧菜单栏中，选择"域名管理"。
3. 在域名列表中，单击需要修改的域名，进入"概览"页面。
4. 在左侧菜单栏选择"规则引擎"页签，单击"创建规则"，进入配置界面。
5. 填写"规则名称"，根据[触发条件]和[执行操作]的指引完成规则配置，单击"确定"，完成规则添加。
   - 规则名称：支持输入1\~50个字符。
   
   - 优先级：优先级取值范围为1-1000，数值越大优先级越高。
   
   
   图2创建规则   
   ![](https://support.huaweicloud.com/usermanual-cdn/zh-cn_image_0000002772797755.png "点击放大") 
 
 #### 触发条件
每个触发条件都由"逻辑运算符"和"条件规则"组成。
**逻辑运算符**：同一层级的条件规则（包含嵌套规则）由"并且"和"或者"做逻辑判断。
- 并且：代表必须满足当前层级的所有条件才可触发操作。
- 或者：代表满足当前层级的某一个条件即可触发操作。
**条件规则**：每一个条件规则由"条件"、"运算符"和"值"组成。"条件"和"值"用来决定哪些请求需遵循当前规则，"运算符"用来定义哪种情况下该条件规则成立。
运算符：
- **包含任意一个**：用户请求包含条件的任意一个值时，条件成立。
- **不包含其中任意一**个：用户请求完全不包含条件的任意一个值时，条件成立。
- **存在**：用户请求信息中存在当前条件配置的参数时（无论值是什么），条件成立。
- **不存在**：用户请求信息中不存在当前条件配置的参数时（无论值是什么），条件成立。
 
触发条件规则配置说明
当用户请求匹配了当前的触发条件规则时，将执行当前规则配置的操作。触发条件配置时相关参数解释详见[表1]。
 表1触发条件可配置参数说明 
| 条件       | 匹配条件含义                                                                                                                                                                                                                                                                                                                                                                                                                                 | 名称                                                                                                                                                                                                                                                                                                              | 运算符                                                                                                                                                                                                                                                                                         | 值                                                                                                                                                                                                                                                                                                                                                                                                                                                        | 区分大小写（值）                              |
|:---|:---|:---|:---|:---|:---|
| 协议类型      | 客户端请求使用的协议类型，例如：HTTP、HTTPS。                                                                                                                                                                                                                                                                                                                                                                                                             | 不涉及                                                                                                                                                                                                                                                                                                              | - 包含任意一个  - 不包含其中任意一个                                                                                                                                            | - HTTP  - HTTPS                                                                                                                                                                                                                                                                                                       | 不涉及                                   |
| 请求方法     | 客户端请求使用的请求方法，例如：GET、PUT。                                                                                                                                                                                                                                                                                                                                                                                                                | 不涉及                                                                                                                                                                                                                                                                                                              | - 包含任意一个  - 不包含其中任意一个                                                                                                                                            | 当前支持的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、PATCH、TRACE、CONNECT。                                                                                                                                                                                                                                                                                                                                                                                          | 不涉及                                  |
| URI路径     | 客户端请求URL中的路径，不含请求参数，例如：/favicon.ico。 说明： - 如果加速域名配置了[配置客户端访问URL重写](https://support.huaweicloud.com/usermanual-cdn/cdn_01_0263.html)功能，CDN将使用重写后的URL回源，此时如果需要配置[回源URL改写](https://support.huaweicloud.com/usermanual-cdn/cdn_01_0179.html)或[配置高级回源](https://support.huaweicloud.com/usermanual-cdn/cdn_01_0221.html)，请使用重写后的路径，否则无法匹配到该条规则。   | 不涉及                                                                                                                                                                                                                                                                                                              | - 包含任意一个  - 不包含其中任意一个                                                                                                                                       | - 以"/"作为首字符的URI，如：/test/index.html，不含http(s)://头及域名。  - 最多可输入20个URI路径。  - 单个条件规则的值最多可配置3个"\*"。   说明： 当"运算符"是"包含任意一个"或者"不包含其中任意一个"时，URI路径的匹配模式为完整匹配，例如：配置/test时，仅能匹配到目录/test，无法匹配到目录/test/folder01；如果想要匹配/test所有子目录，需要配置为/test/\*。 | 默认区分大小写，关闭"区分大小写"开关后，大写和小写将认为是同一个值。   |
| HTTP请求头    | 用户请求中携带的请求头。                                                                                                                                                                                                                                                                                                                                                                                                                            | 请求头名称 - 当前支持配置单个请求头。  - 支持大小写字母、数字、"-"、"."、"_"。  - 请求头名称不区分大小写，即Expires与EXPIRES代表同一个请求头。   | - 包含任意一个  - 不包含其中任意一个  - 存在  - 不存在   | - 支持数字0-9、字符a-z、A-Z，及特殊符.-_\*#!\&+\|\^\~'"/:;,=@?\<\>%  - 支持配置多个值                                                                                                                                                                                                                                                          | 默认区分大小写，关闭"区分大小写"开关后，大写和小写将认为是同一个值。    |
| 查询参数        | 用户请求URL中携带的请求参数。                                                                                                                                                                                                                                                                                                                                                                                                                         | 请求参数名称 - 参数名称不区分大小写。                                                                                                                                                                                                  | - 包含任意一个  - 不包含其中任意一个  - 存在  - 不存在    | - 支持输入多个值                                                                                                                                                                                                                                                                                                                                                                                | 默认区分大小写，关闭"区分大小写"开关后，大写和小写将认为是同一个值。   |
| 文件名称     | 客户端请求的文件的名称，例如：name1。                                                                                                                                                                                                                                                                                                                                                                                                                   | 不涉及                                                                                                                                                                                                                                                                                                              | - 包含任意一个  - 不包含其中任意一个                                                                                                                                             | - 支持数字0-9、字符a-z、A-Z，及特殊符.-_\*#!\&+\|\^\~'"/:;,=@?\<\>%  - 支持输入多个值                                                                                                                                                                                                                                                            | 默认区分大小写，关闭"区分大小写"开关后，大写和小写将认为是同一个值。 |
| 文件后缀     | 客户端请求的文件的后缀名，从右向左识别，识别到第一个"."，例如：.txt。                                                                                                                                                                                                                                                                                                                                                                                                   | 不涉及                                                                                                                                                                                                                                                                                                            | - 包含任意一个  - 不包含其中任意一个                                                                                                                                          | 支持配置.txt、.doc、.html、.jpg、.png、.svg、.zip、.rar等后缀，可选择或输入多个后缀。                                                                                                                                                                                                                                                                                                                                                                                              | 默认区分大小写，关闭"区分大小写"开关后，大写和小写将认为是同一个值。  |
| 客户端IP    | 客户端的IP。                                                                                                                                                                                                                                                                                                                                                                                                                                  | - 建联IP  - x-forwarded-for头                                                                                                                                                   | - 包含任意一个  - 不包含其中任意一个                                                                                                                                              | - 支持IPv4（如0.0.0.0）、IPv6（如240e:95c:3004:2:3:0:0:XXX）。  - 支持配置网段（如192.168.XXX.XXX/31）。IPV4的网段支持1\~32；IPV6的网段支持1\~128。  - 最多可配置50个IP地址。                                                                                                                             | 不涉及                                   |
| 客户端IP版本    | IPv4或IPv6。                                                                                                                                                                                                                                                                                                                                                                                                                            | - 建联IP  - x-forwarded-for头                                                                                                                                                            | - 包含任意一个  - 不包含其中任意一个                                                                                                                                         | - IPv4  - IPv6。                                                                                                                                                                                                                                                                                                              | 不涉及                                 |
| Nginx变量   | 当其他条件无法满足需求时，支持使用Nginx变量来配置，支持的变量有$arg_、$http_、$scheme、$uri、$ssl_protocol、$ssl_server_name、$remote_addr、$http2、$request_method。变量解释详见[表2]。                                                                                                                                                                                                                                                           | Nginx变量名称 - $开头，支持大小写字母、数字、"_"。  - 变量名称不区分大小写。                                                                                                         | - 包含任意一个  - 不包含其中任意一个  - 存在  - 不存在    | - 支持数字0-9、字符a-z、A-Z，及特殊符.-_\*#!\&+\|\^\~'"/:;,=@?\<\>%  - 支持输入多个值                                                                                                                                                                                                                                                              | 默认区分大小写，关闭"区分大小写"开关后，大写和小写将认为是同一个值。   |
| User-Agent | 请求头中的User-Agent。                                                                                                                                                                                                                                                                                                                                                                                                                         | 不涉及                                                                                                                                                                                                                                                                                                              | - 包含任意一个  - 不包含其中任意一个                                                                                                                                           | - 支持数字0-9、字符a-z、A-Z，空格，通配符"\*"及特殊符.-_();,/'#!@$\^\&+=\~?"\[\]:{}\\%。  - 支持输入多个值。                                                                                                                                                                                                                                               | 默认区分大小写，关闭"区分大小写"开关后，大写和小写将认为是同一个值。 |
| 地理位置       | 客户端请求所在的位置区域。                                                                                                                                                                                                                                                                                                                                                                                                                           | 不涉及                                                                                                                                                                                                                                                                                                               | - 包含任意一个  - 不包含其中任意一个                                                                                                                                           | 当前支持选择部分区域，支持选择多个区域。区域范围选择中国大陆时，支持选择具体省份。 - 因部分IP不包含省份信息，当配置具体省份时，可能存在无法匹配的场景。  - 由于IP归属为运营商且不定期调整，华为云虽会定期更新IP地址库，也可能存在更新滞后的情况。因此可能导致部分规则偶尔误拦截或放行等情况发生。                                                                                                                                   | 不涉及                                    |
   
 表2变量解释 
| **变量名**              | **含义**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
|:---|:---|
| **$protocol**         | 用于与对端通信的协议，如：TCP或UDP。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| **$arg_*name***      | Nginx前缀变量，获取指定*name*的请求参数。 示例： 如果客户端请求http://www.example.com/test_dir/test_filename?aaa_bbb=123456\&key=value，那么： - $arg_aaa_bbb表示获取查询参数aaa_bbb的值，即123456。  - $arg_key表示获取查询参数key的值，即value。                                                                                                                                                                                         |
| **$http_*name***     | Nginx前缀变量，获取指定*name* 的请求头。*name*是转换为小写的请求头名称，请求头名称中的短划线替换为下划线。 示例： - $http_user_agent表示获取请求头User-Agent的值。  - $http_accept_encoding表示获取请求头Accept-Encoding的值。                                                                                                                                                                                                                                                |
| **$scheme**         | 客户端请求所使用的请求协议，如：http或https。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| **$uri**            | 非原始请求URL，Nginx会进行标准化处理： - **自动解码URL编码的字符**（如%20转换为空格）。  - **去除查询参数**（即$uri不包含"?"及其后面的内容）。  - **标准化路径**（合并多个/）。   示例： 客户端请求URL：/ngx_http_variables_test**//**%E4%B8%AD%E6%96%87/1.txt?test1=1\&test2%E4%B8%AD%E6%96%87=2\&test3=%E4%B8%AD%E6%96%87 获取的变量值：/ngx_http_variables_test/中文/1.txt |
| **$ssl_protocol**    | 返回已建立的SSL连接的协议类型，如：TLSv1、TLSv1.1、TLSv1.2、TLSv1.3等。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| **$ssl_server_name** | 返回SNI。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| **$remote_addr**     | 表示与节点建连的对端的IP，非用户的IP。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| **$http2**          | 协商的协议版本标识符。"h2"用于基于TLS的HTTP/2协议。"h2c"用于基于明文TCP的HTTP/2协议，否则为空字符串。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| **$request_method**   | 客户端请求方法，如：GET、POST。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
   
 #### 执行操作
当客户端请求匹配了触发条件中的规则时，将执行相关配置。当前规则引擎支持的配置详见[表3]。
 表3规则引擎支持的配置项 
| 功能分类          | 功能名称                                                                                | 说明                                                                                                                                                                                                                                                               |
|:---|:---|:---|
| 基础配置            | [HTTP header响应头](https://support.huaweicloud.com/usermanual-cdn/cdn_01_0021.html) | 与"高级配置"中的"HTTP header配置（跨域请求）"配置要求基本一致，不同点如下： - HTTP header响应头：仅对规则匹配的资源生效。  - HTTP header配置（跨域请求）：对域名下所有资源生效。   |
| 基础配置            | [高级回源](https://support.huaweicloud.com/usermanual-cdn/cdn_01_0221.html)         | 匹配了条件规则中触发条件的客户端请求，需要遵循该条件规则中的高级回源配置。                                                                                                                                                                                                                          |
| 基础配置            | [回源请求头](https://support.huaweicloud.com/usermanual-cdn/cdn_01_0126.html)        | 匹配了条件规则中触发条件的客户端请求，需要遵循该规则中回源请求头配置。                                                                                                                                                                                                                            |
| 提升访问安全  | [访问控制](https://support.huaweicloud.com/usermanual-cdn/cdn_01_0124.html)            | 匹配了条件规则中触发条件的客户端请求，需要遵循该条件规则中的访问控制配置。当前可配置允许和拒绝。 - 允许：匹配条件的请求可正常访问资源。  - 拒绝：匹配条件的请求将被拦截，返回403状态码。          |
| 提升命中率         | [回源URL改写](https://support.huaweicloud.com/usermanual-cdn/cdn_01_0179.html)        | 匹配了条件规则中触发条件的客户端请求，需要遵循该条件规则中的回源URL改写配置。 **改写方式**：定义如何获取改写内容，支持配置精确改写和捕获改写。非规则引擎中的回源URL改写功能，匹配方式所有文件、URL路径对应精确改写，通配符对应捕获改写。                                                                                                       |
| 提升命中率         | [缓存规则](https://support.huaweicloud.com/usermanual-cdn/cdn_01_0116.html)        | 匹配了条件规则中触发条件的客户端请求，需要遵循该条件规则中的缓存规则配置。                                                                                                                                                                                                                          |
| 提升命中率         | [访问URL重写](https://support.huaweicloud.com/usermanual-cdn/cdn_01_0263.html)    | 匹配了条件规则中触发条件的客户端请求，需要遵循该条件规则中的访问URL重写配置。                                                                                                                                                                                                                         |
| 提升命中率         | [Range回源](https://support.huaweicloud.com/usermanual-cdn/cdn_01_0027.html)     | 匹配了条件规则中触发条件的客户端请求，未命中缓存回源时，需要遵循Range回源规则。                                                                                                                                                                                                                    |
| 缓存配置           | [状态码缓存过期时间](https://support.huaweicloud.com/usermanual-cdn/cdn_01_0213.html)    | 匹配了条件规则中触发条件的客户端请求，需要遵循该条件规则中的状态码缓存过期时间配置。                                                                                                                                                                                                                       |
| 缓存配置           | [浏览器缓存过期时间](https://support.huaweicloud.com/usermanual-cdn/cdn_01_0262.html)     | 匹配了条件规则中触发条件的客户端请求，需要遵循该条件规则中的浏览器缓存过期时间配置。                                                                                                                                                                                                                     |
   
#### IP地址校验模式
规则引擎功能的"IP地址校验模式"分为两种，使用不同的"IP地址校验模式"会影响到CDN节点对客户端IP的判断：
- 建联 IP：该模式匹配的是客户端与CDN节点之间建连使用的IP，如果客户端与CDN节点之间有经过代理服务器，那么建联IP=代理服务器IP。
- x-forwarded-for头：该模式匹配的是用户请求中x-forwarded-for请求头携带的左边第一个IP，不论客户端与CDN节点之间是否有经过代理服务器，x-forwarded-for头IP都=客户端真实IP。
示例：假设客户端真实IP为10.10.10.10，代理服务器IP为192.168.0.1。
- 没有经过代理服务器：
  - 用户请求中x-forwarded-for请求头值：10.10.10.10。
  
  - 客户端真实IP（即x-forwarded-for请求头携带的左边第一个IP）=客户端与CDN节点建连IP=10.10.10.10。
   
- 经过代理服务器：
  - 用户请求中x-forwarded-for请求头值：10.10.10.10,192.168.0.1。
  
  - 客户端真实IP（即x-forwarded-for请求头携带的左边第一个IP）=10.10.10.10。
  
  - 客户端与CDN节点建连IP=代理服务器IP=192.168.0.1。
  
  - 客户端真实IP（即x-forwarded-for请求头携带的左边第一个IP）≠客户端与CDN节点建连IP。
   
 
#### 相关文档
调用接口修改规则引擎请参考：[创建规则引擎规则](https://support.huaweicloud.com/api-cdn/CreateRuleNew.html)。
