概述
規則引擎功能能夠使用圖形化的方式來配置各種條件規則。條件規則支持對用戶請求中攜帶的各種參數信息進行識別,以此來決定某個配置是否對該請求生效,可用于更加靈活、更加精確地控制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。 | 不涉及 |
|
| 不涉及 | $scheme |
請求方法 | method | 客戶端請求使用的請求方法,例如:GET、PUT。 | 不涉及 |
|
| 不涉及 | $request_method |
URI(路徑) | uri | 客戶端請求URL中的路徑,不含請求參數,例如: | 不涉及 |
| 支持通配符 |
| $raw_uri或$uri |
文件名 | basename | 客戶端請求的文件的名稱,例如:name1。 | 不涉及 |
| 支持通配符 |
| - |
文件擴展名 | extension | 客戶端請求的文件的后綴名,從右向左識別,識別到第一個".",例如: | 不涉及 |
| 支持通配符 |
| - |
Hostname | hostname | 客戶端請求攜帶的hostname,匹配順序:請求URL中的host>請求頭HOST中的host。 | 不涉及 |
| 用戶請求的host,支持輸入多個值。 |
| $host或$http_host |
客戶端IP | clientip | 客戶端的IP。 支持IPv4(例如 |
說明 建聯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地址校驗模式。 |
|
| 不涉及 | - |
用戶網絡運營商 | geolocation | 客戶端IP歸屬的運營商。 |
說明 建聯IP、XFF IP詳細說明,請參見IP地址校驗模式。 |
| 可以通過下拉列表來選擇,可以輸入字符來過濾選項,支持輸入ID或名稱來模糊匹配查詢,支持輸入多個值。 | 不涉及 | $ip_isp_id |
用戶IP地理位置 | geolocation | 客戶端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值,例如: |
| $http_user_agent |
Range分桶 | range | 將客戶端請求分桶,按百分比執行。 | 不涉及 |
| 輸入百分比的數值。 | 不涉及 | - |
時間 | time | 客戶端請求發生的時間,時區為東八區(北京時間),例如:09:10~14:22。 | 不涉及 |
| 直接輸入時間段,例如09:10~14:22 ,表示9點10分至14點22分。 | 不涉及 | - |
Nginx Var | ngxvar | 當上方所有的變量均無法滿足需求時,支持使用Nginx變量來配置,支持的變量詳見Nginx官網:Nginx變量。 | 可以通過下拉列表來選擇或直接輸入變量名,支持 |
| 支持輸入多個值。 | 不涉及 | ${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個匹配值。 包含匹配的情況有兩種:
|
不包含其中任意一個 | matchOperator為contains,并且參數negate的值為true。 | |
大于 | matchOperator為gt。 | 即 |
小于 | matchOperator為lt。 | 即 |
大于等于 | matchOperator為ge。 | 即 |
小于等于 | matchOperator為le | 即 |
正則匹配 | matchOperator為regex。 | 匹配值可以填寫正則表達式,實現對變量的正則匹配。 說明 通過控制臺或者OpenAPI來配置的情況下,無法使用正則相關的匹配運算符(包括正則匹配和正則不匹配),但是可以查看已經存在的配置。 |
正則不匹配 | matchOperator為regex,并且參數negate的值為true。 |
通配符
通配符號 | 含義 |
| 表示匹配任意1個字符。 |
| 表示匹配任意多個字符。 |
當前支持引用規則條件的功能
功能分類 | 功能名稱 |
基本配置 | |
緩存配置 | |
回源配置 | |
訪問控制 | |
性能優化 | |
視頻相關 | |
流量限制 |
操作步驟
登錄CDN控制臺。
在左側導航欄,單擊域名管理。
在域名管理頁面,找到目標域名,單擊操作列的管理。
在指定域名的左側導航欄,單擊規則引擎。
單擊添加規則。
在添加規則頁面,設置規則名稱和規則內容。
單擊提交,完成配置。