规则引擎

概述

规则引擎功能能够使用图形化的方式来配置各种条件规则。条件规则支持对用户请求中携带的各种参数信息进行识别,以此来决定某个配置是否对该请求生效,可用于更加灵活、更加精确地控制CDN的各种配置策略的执行效果。

背景说明

阿里云CDN产品控制台提供了配置缓存过期时间、回源参数改写等诸多基础功能,这些基础功能可以满足大部分常见的通用需求,但是还有一些需求是基础功能无法满足的。例如:将包含路径/example的请求回源到指定源站地址。类似这样的需求,就需要基础功能搭配规则引擎,才可以实现较为灵活的自定义配置。另外,阿里云CDN产品还提供了边缘脚本功能,能够实现高度灵活的用户定制需求。

配置能力

基础功能

基础功能+规则引擎

边缘脚本(可编程CDN)

功能实现

常见的通用功能配置

较为灵活的自定义配置

高度灵活的自定义配置

使用场景

常见的通用需求

部分自定义高级配置需求

定制化的用户需求

上手难度(对用户技术要求)

配置灵活性

注意事项

  • 单个域名下的规则引擎功能最大支持创建50个规则条件。

  • 单个规则条件中的子条件数量最大不超过20个。

  • 通过控制台或者OpenAPI来配置的情况下,无法使用正则相关的匹配运算符(包括正则匹配和正则不匹配),但是可以查看已经存在的配置。

  • 通过控制台或者OpenAPI来配置的情况下,单个域名下所有功能对规则条件的总引用次数最大不超过5次。

  • 规则条件支持嵌套,嵌套层次深度最大限制为3层,不同层级支持独立的逻辑关系设置。

规则条件的语法说明

一个规则条件由“逻辑判断运算符”与“条件表达式”构成,具体见下方说明。

逻辑判断(Logic)

对同一个层级内的条件(包括被嵌套的条件集合)进行逻辑判断,支持and和or。

  • and(并且):逻辑与运算符,所有条件都为真才会匹配成功。

  • or(或者):逻辑或运算符,其中一个条件为真即可匹配成功。

条件表达式包含的参数

最小粒度的条件表达式包含以下参数:

参数名称

域名配置功能函数condition中对应的配置参数

参数说明

是否必填

条件匹配

match

表示条件匹配表达式。

逻辑判断

logic

表示条件匹配表达式的逻辑判断参数,取值为and和or。

条件判断内容

criteria

表示条件表达式的判断内容。

匹配类型

MatchType

表示对用户请求中携带的某一类型信息进行匹配。

匹配对象

MatchObject

表示对匹配类型进行进一步的细分,例如:客户端IP可以进一步细分为“建联IP”和“XFF IP”。

匹配运算符

MatchOperator

表示匹配操作执行的具体动作。

匹配值

MatchValue

表示预先设定的匹配值,将会与用户请求中携带的信息进行匹配。

条件判断值取反

negate

表示是否对条件表达式的结果取反,取值为true和false。

大小写敏感

caseSensitive

表示对匹配值中的字符是否大小写敏感。

规则条件名称

name

表示规则条件的名称。

生效状态

status

表示规则条件的生效状态。

条件表达式的配置方法

匹配类型名称

域名配置功能函数condition中对应的配置参数

匹配类型含义

匹配对象

匹配运算符

匹配值

大小写敏感

对应nginx/tengine

协议类型

scheme

客户端请求使用的协议类型,例如:HTTP、HTTPS。

不涉及

  • 等于

  • 不等于

  • http

  • https

不涉及

$scheme

请求方法

method

客户端请求使用的请求方法,例如:GET、PUT。

不涉及

  • 等于

  • 不等于

  • get

  • put

  • post

  • delete

  • head

不涉及

$request_method

URI(路径)

uri

客户端请求URL中的路径,不含请求参数,例如:/favicon.ico

不涉及

  • 包含其中任意一个

  • 不包含其中任意一个

支持通配符?*, 例如:填写 /*/my_path/*,支持输入多个值。

  • 区分大小写

  • 忽略大小写

$raw_uri或$uri

文件名

basename

客户端请求的文件的名称,例如:name1。

不涉及

  • 包含其中任意一个

  • 不包含其中任意一个

支持通配符?*,支持输入多个值。

  • 区分大小写

  • 忽略大小写

-

文件扩展名

extension

客户端请求的文件的后缀名,从右向左识别,识别到第一个".",例如:.mp4

不涉及

  • 包含其中任意一个

  • 不包含其中任意一个

支持通配符?*,支持输入多个值。

  • 区分大小写

  • 忽略大小写

-

Hostname

hostname

客户端请求携带的hostname,匹配顺序:请求URL中的host>请求头HOST中的host。

不涉及

  • 包含其中任意一个

  • 不包含其中任意一个

用户请求的host,支持输入多个值。

  • 区分大小写

  • 忽略大小写

$host或$http_host

客户端IP

clientip

客户端的IP。 支持IPv4(例如1.1.X.X)、IPv6(例如240e:95c:3004:2:3:0:0:XXX)、支持网段(例如20.209.XXX.XXX/31)。

  • 建联IP

  • XFF IP

说明

建联IP、XFF IP详细说明,请参见IP地址校验模式

  • 包含其中任意一个

  • 不包含其中任意一个

支持填写IPv6格式IP,例如:240e:XXX:3004:2:3:0:0:3f7,支持网段方式填写,例如:120.209.XXX.XXX/31,支持输入多个值。

不涉及

$remote_addr

客户端IP版本

clientipVer

IPv4或IPv6。

  • 建联IP

  • XFF IP

说明

建联IP、XFF IP详细说明,请参见IP地址校验模式

  • 等于

  • 不等于

  • v4

  • v6

不涉及

-

用户网络运营商

geolocation

客户端IP归属的运营商。

  • 建联IP

  • XFF IP

说明

建联IP、XFF IP详细说明,请参见IP地址校验模式

  • 包含其中任意一个

  • 不包含其中任意一个

可以通过下拉列表来选择,可以输入字符来过滤选项,支持输入ID或名称来模糊匹配查询,支持输入多个值。

不涉及

$ip_isp_id

用户IP地理位置

geolocation

客户端IP所处的地理位置。

  • 建联IP

  • XFF IP

说明

建联IP、XFF IP详细说明,请参见IP地址校验模式

  • 包含其中任意一个

  • 不包含其中任意一个

可以通过下拉列表来选择,可以输入字符来过滤选项,支持输入ID或名称来模糊匹配查询,支持输入多个值。

不涉及

$ip_country_id

请求参数

querystring

用户请求URL中携带的请求参数。

输入参数名称。

  • 存在

  • 不存在

  • 包含其中任意一个

  • 不包含其中任意一个

  • 大于

  • 大于等于

  • 小于

  • 小于等于

支持通配符?*,支持输入多个值。

  • 区分大小写

  • 忽略大小写

$arg_{name}

请求头

header

用户请求中携带的请求头。

支持输入参数名称,也支持通过下拉列表来选择参数。

  • 存在

  • 不存在

  • 包含其中任意一个

  • 不包含其中任意一个

  • 大于

  • 大于等于

  • 小于

  • 小于等于

支持输入多个值。

  • 区分大小写

  • 忽略大小写

$http_{name}

Cookie

cookie

请求携带的Cookie。

输入Cookie名称。

  • 存在

  • 不存在

  • 包含其中任意一个

  • 不包含其中任意一个

  • 大于

  • 大于等于

  • 小于

  • 小于等于

支持通配符?*,支持输入多个值。

  • 区分大小写

  • 忽略大小写

$cookie_{name}

User-Agent

useragent

请求头里的User-Agent。

不涉及

  • 包含其中任意一个

  • 不包含其中任意一个

可以选择下拉列表中的值,或者直接输入UA值,例如:*Chrome/25*,支持通配符?*,支持输入多个值(最多仅支持配置32个UA,超过这个数量后,配置的UA不生效)。

  • 区分大小写

  • 忽略大小写

$http_user_agent

Range分桶

range

将客户端请求分桶,按百分比执行。

不涉及

  • 等于

  • 不等于

输入百分比的数值。

不涉及

-

时间

time

客户端请求发生的时间,时区为东八区(北京时间),例如:09:10~14:22。

不涉及

  • 包含其中任意一个

  • 不包含其中任意一个

直接输入时间段,例如09:10~14:22 ,表示9点10分至14点22分。

不涉及

-

Nginx Var

ngxvar

当上方所有的变量均无法满足需求时,支持使用Nginx变量来配置,支持的变量详见Nginx官网:Nginx变量

可以通过下拉列表来选择或直接输入变量名,支持$region:$isp这种拼接方式。

  • 存在

  • 不存在

  • 包含其中任意一个

  • 不包含其中任意一个

  • 大于

  • 大于等于

  • 小于

  • 小于等于

支持输入多个值。

不涉及

${name}

IP地址校验模式

规则引擎功能的“IP地址校验模式”分为两种,使用不同的“IP地址校验模式”会影响到CDN节点对客户端IP的判断:

  • 建联 IP:该模式匹配的是客户端与CDN节点之间建连使用的IP,如果客户端与CDN节点之间有经过代理服务器,那么建联IP=代理服务器IP。

  • XFF IP:该模式匹配的是用户请求中x-forwarded-for请求头携带的左边第一个IP,不论客户端与CDN节点之间是否有经过代理服务器,XFF IP都=客户端真实IP。

选择使用哪一种“IP地址校验模式”主要取决于用户请求在经过CDN节点时,中间是否有经过代理服务器。

需要注意,引用规则条件的功能在CDN节点上的生效位置也会影响到对“IP地址校验模式”的选择(对于在L2节点上生效的回源配置相关功能而言,用户请求经过的L1节点就相当于中间经过了代理服务器)。

示例:假设客户端真实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。

少数ISP在特定区域可能会分配私有IP地址给用户端,导致CDN节点接收到的是用户的私有IP地址。

说明

私有IP地址范围有以下三个:

  • A类私有IP地址:10.0.0.0~10.255.255.255,子网掩码:10.0.0.0/8

  • B类私有IP地址:172.16.0.0~172.31.255.255,子网掩码:172.16.0.0/12

  • C类私有IP地址:192.168.0.0~192.168.255.255,子网掩码:192.168.0.0/16

匹配运算符(matchOperator)

名称

域名配置功能函数condition中对应的配置参数

含义

等于

matchOperator为equals。

变量完全等于匹配值或者完全不等于匹配值的时候,条件才成立。

不等于

matchOperator为equals,并且参数negate的值为true。

存在

matchOperator为exists。

变量存在或者不存在时,条件即成立。

不存在

matchOperator为exists,并且参数negate的值为true。

包含其中任意一个

matchOperator为contains。

变量包含(不包含)任意一个匹配值的时候,条件即成立。最多支持32个匹配值。

包含匹配的情况有两种:

  • 精确匹配:直接输入匹配对象,包含:a,必须=a才能匹配上。

  • 通配符匹配:可以加入*作为通配符,可以支持配置a**a*a*,可以对应abc、bca、bcabc。

不包含其中任意一个

matchOperator为contains,并且参数negate的值为true。

大于

matchOperator为gt。

>

小于

matchOperator为lt。

<

大于等于

matchOperator为ge。

>=

小于等于

matchOperator为le

<=

正则匹配

matchOperator为regex。

匹配值可以填写正则表达式,实现对变量的正则匹配。

说明

通过控制台或者OpenAPI来配置的情况下,无法使用正则相关的匹配运算符(包括正则匹配和正则不匹配),但是可以查看已经存在的配置。

正则不匹配

matchOperator为regex,并且参数negate的值为true。

通配符

通配符号

含义

?

表示匹配任意1个字符。

*

表示匹配任意多个字符。

当前支持引用规则条件的功能

功能分类

功能名称

基本配置

条件源站

缓存配置

缓存过期时间

自定义HTTP响应头

访问URL改写规则

回源配置

回源HTTP请求头

回源HTTP响应头

回源参数改写

访问控制

配置Referer防盗链

配置URL鉴权

配置IP黑白名单

配置UA黑白名单

性能优化

忽略参数

视频相关

配置Range回源

流量限制

单请求限速

操作步骤

  1. 登录CDN控制台

  2. 在左侧导航栏,单击域名管理

  3. 域名管理页面,找到目标域名,单击操作列的管理

  4. 在指定域名的左侧导航栏,单击规则引擎

  5. 单击添加规则

  6. 添加规则页面,设置规则名称规则内容

  7. 单击提交,完成配置。