关于边缘脚本,官方的解释是:
边缘脚本内置了CDN节点可以识别的变量、简单的判断语句,同时提供了大量阿里云CDN封装好的函数供您直接调用。通过简单的变量判断并调用现成的函数,即可满足您绝大部分定制的鉴权、缓存、限速、请求头增减等定制配置需求。可以有效地帮您解决定制化配置需求无法实现、业务变更不敏捷的问题。
三叔的理解就是:
在CDN和服务器之间编写脚本。你可以在这里按照自己对请求过来的数据(参数、ip、cookie)进行判断后,然后调用限速、拒绝或其他自定义操作。
说白了,你如果想过滤掉一些请求,可就用它了。
内置变量名 | 含义 | 对应nginx原生变量 |
---|---|---|
$arg_{name} | Query String中的参数name值。Query String表示HTTP请求中的请求参数。 | $arg_ 说明 {name}中出现的连接号(-),需要使用下划线(_)替代,例如:X-USER-ID对应为$arg_x_user_id。 |
$http_{name} | 请求头中的name值。 | $http_ 说明 {name}中出现的连接号(-),需要使用下划线(_)替代,例如:X-USER-ID对应为$http_x_user_id。 |
$cookie_{name} | 请求cookie头中的name值。 | $cookie_ 说明 {name}中出现的连接号(-),需要使用下划线(_)替代,例如:X-USER-ID对应为$cookie_x_user_id。 |
$scheme | 协议类型。 | $scheme |
$server_protocol | 协议版本。 | $server_protocol |
$host | 原始host。 | $host |
$uri | 原始URI。 | 无 |
$args | $args表示当前HTTP请求的全部请求参数,但不包含问号(?)。例如:http://www.a.com/1k.file?k1=v1&k2=v2。
| $args |
$request_method | 请求方法。 | $request_method |
$request_uri | uri+'?'+args的内容。 | $request_uri |
$remote_addr | 客户的IP地址。 | $remote_addr |
说明
内置变量名前的美元符号($)仅为强调其内置变量属性,删除后不影响使用。
内置变量不允许担当左值,即内置变量不允许被赋值。
每条ES规则中最多支持使用200个全局变量,局部变量不限。如果全局变量超过200个请自定义函数,并在函数中以局部变量的形式使用全局变量。
函数分类 | 函数 |
---|---|
条件判断相关 | 条件判断相关函数包括:and、or、not、eq、ne、null。 |
数字类型相关 | 数字类型相关函数包括:add、sub、mul、div、mod、gt、ge、lt、le、floor、ceil。 |
字符串类型相关 | 字符串类型相关函数包括:substr、concat、upper、lower、len、byte、match_re、capture_re、gsub_re、split、split_as_key、tohex、tostring、tochar、reverse、find、format、tobin、trim。 |
字典类型相关 | 字典类型相关函数包括:set、get、foreach、del。 |
请求处理相关 | 请求处理相关函数包括:add_req_header、del_req_header、add_rsp_header、del_rsp_header、encode_args、decode_args、rewrite、say、print、exit、get_rsp_header、add_rsp_cookie。 |
限速相关 | 限速相关函数包括:limit_rate_after、limit_rate。 |
缓存相关 | 缓存相关函数为:set_cache_ttl。 |
时间相关 | 时间相关函数包括:today、time、now、localtime、utctime、cookie_time、http_time、parse_http_time、unixtime。 |
密码算法相关 | 密码算法相关函数包括:aes_new、aes_enc、aes_dec、sha1、sha2、hmac、hmac_sha1、md5、md5_bin。 |
JSON相关 | JSON相关函数包括:json_enc、json_dec。 |
Misc相关 | Misc相关函数包括:base64_enc、base64_dec、url_escape、url_unescape、rand、rand_hit、crc、tonumber、base64_enc_safe、base64_dec_safe、randomseed。 |
数组类型相关 | 数组类型相关函数包括:arr_concat、arr_insert、arr_remove、arr_sort、arr_len。 |
请求判断相关 | 请求判断相关函数包括:server_addr、server_port、client_addr、client_country、client_region、client_isp、ip_country、ip_region、ip_isp、req_uri、req_uri_basename、req_uri_ext、req_uri_seg、req_uri_arg、req_uri_query_string、req_scheme、req_method、req_host、req_user_agent、req_referer、req_cookie、req_first_x_forwarded、req_header、req_id。 |
函数详细信息,请参见下表:
项目 | 描述 |
---|---|
语法 | and(arg, ...)。 |
说明 |
|
参数 | 一个或多个参数,参数类型不限。 |
返回值 | 全部参数为真时返回true,任一参数为假时返回false。 |
示例 | if and($arg_mode, eq($arg_mode, 'set_header')) { add_rsp_header('USER-DEFINED-1','path1') }
|
函数详细信息,请参见下表:
项目 | 描述 |
---|---|
语法 | or(arg, ...)。 |
说明 |
|
参数 | 一个或多个参数,参数类型不限。 |
返回值 | 任一参数为真时返回true,全部参数为假返时false。 |
示例 | if and($http_from, or(eq($http_from, 'wap'), eq($http_from, 'comos'))) { rewrite(concat('http://tech.com.cn/zt_d/we2015/', $http_from), 'enhance_redirect') }
|
函数详细信息,请参见下表:
项目 | 描述 |
---|---|
语法 | not(arg)。 |
说明 | 逻辑运算符取反。参数undef和false为假,其余为真。 |
参数 | 仅接受1个参数,参数类型不限。 |
返回值 |
|
示例 | if not($arg_key) { exit(403) }if not($cookie_user) { exit(403, 'not cookie user') }if not(0) { exit(403) }if not(false) { exit(403) }
|
函数详细信息,请参见下表:
项目 | 描述 |
---|---|
语法 | eq(arg1, arg2)。 |
说明 | 比较2个参数是否相等。 |
参数 |
|
返回值 | 参数相等返回true,否则返回false。 |
示例 | key1 = 'value1'key2 = 'value2'if and($arg_k1, $arg_k2, eq(key1, $arg_k1), ne(key2, $arg_k2)) { say('match condition') }
|
函数详细信息,请参见下表:
项目 | 描述 |
---|---|
语法 | ne(arg1, arg2)。 |
说明 | 比较2个参数是否不等。 |
参数 |
|
返回值 | 参数不等返回true,否则返回false。 |
示例 | key1 = 'value1'key2 = 'value2'if and($arg_k1, $arg_k2, eq(key1, $arg_k1), ne(key2, $arg_k2)) { say('match condition') }
|
函数详细信息,请参见下表:
项目 | 描述 |
---|---|
语法 | null(v)。 |
说明 | 判断ES数据类型是否为空。 |
参数 | v:需要传入的参数,类型为数组、字典和字符串,其他类型均返回false。 |
返回值 | 返回值为bool类型
|
示例 | d = [] say(null(d))set(d, 1, 'v1') say(null(d)) say(tostring(null('x'))) say(tostring(null('')))输出: truefalsefalsetrue |