阿里云CDN的边缘脚本

阿里云 文章 2021-06-10 16:16 20 0 全屏看文

关于边缘脚本,官方的解释是:

边缘脚本内置了CDN节点可以识别的变量、简单的判断语句,同时提供了大量阿里云CDN封装好的函数供您直接调用。通过简单的变量判断并调用现成的函数,即可满足您绝大部分定制的鉴权、缓存、限速、请求头增减等定制配置需求。可以有效地帮您解决定制化配置需求无法实现、业务变更不敏捷的问题。

三叔的理解就是:
在CDN和服务器之间编写脚本。你可以在这里按照自己对请求过来的数据(参数、ip、cookie)进行判断后,然后调用限速、拒绝或其他自定义操作。


说白了,你如果想过滤掉一些请求,可就用它了。


EdgeScript内置变量如下表所示:

内置变量名含义对应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。
  • $arg_k1可以获得对应的v1值。

  • $args可以获得整个请求参数字符串,即k1=v1&k2=v2,不包括问号(?)。

$args
$request_method请求方法。$request_method
$request_uriuri+'?'+args的内容。$request_uri
$remote_addr客户的IP地址。$remote_addr


说明

  • 内置变量名前的美元符号($)仅为强调其内置变量属性,删除后不影响使用。

  • 内置变量不允许担当左值,即内置变量不允许被赋值。

  • 每条ES规则中最多支持使用200个全局变量,局部变量不限。如果全局变量超过200个请自定义函数,并在函数中以局部变量的形式使用全局变量。

    

EdgeScript内置函数的分类和各个分类包含的函数。

函数分类函数
条件判断相关条件判断相关函数包括: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

函数详细信息,请参见下表:

项目描述
语法and(arg, ...)。
说明
  • 逻辑与运算符。

  • 支持短路语义,即某个参数为假时,后续参数不再进行求值。

参数一个或多个参数,参数类型不限。
返回值全部参数为真时返回true,任一参数为假时返回false。
示例


if and($arg_mode, eq($arg_mode, 'set_header')) {
    add_rsp_header('USER-DEFINED-1','path1')
}
  • 当请求携带mode参数且mode参数等于set_header时,设置响应头USER-DEFINED-1。

  • 当请求不携带mode参数,短路语义生效,不再执行后续的eq比较;由于and()为假,不会设置响应头USER-DEFINED-1。

or

函数详细信息,请参见下表:

项目描述
语法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')
}
  • 当请求头from存在,且其值为[wap|comos]时,302重写向至http://tech.com.cn/zt_d/we2015/[wap|comos]。

  • 当请求头from存在,且其值为wap时,短路语义生效,不再执行后续eq comos比较,同时or()返回true。

not

函数详细信息,请参见下表:

项目描述
语法not(arg)。
说明逻辑运算符取反。参数undef和false为假,其余为真。
参数仅接受1个参数,参数类型不限。
返回值
  • true

  • false

示例


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)
}
  • 如果请求未携带参数key时,403拒绝请求。

  • 当请求未携带cookie user时,403拒绝请求,响应body为'not cookie user'。

  • not(0)的结果为false。

  • not(false)的结果为true。

eq

函数详细信息,请参见下表:

项目描述
语法eq(arg1, arg2)。
说明比较2个参数是否相等。
参数
  • arg1:任意类型。

  • arg2:应与arg1类型相同。

返回值参数相等返回true,否则返回false。
示例


key1 = 'value1'key2 = 'value2'if and($arg_k1, $arg_k2, eq(key1, $arg_k1), ne(key2, $arg_k2)) {
    say('match condition')
}
  • 请求参数k1和k2都存在时,执行后续的比较操作。

  • 请求参数k1或k2不存在时,短路语义生效,不再执行后续的比较操作。

  • eq: 请求参数k1的值是否等于value1。

  • ne: 请求参数k2的值不等于value2。

  • 当请求参数k1和k2均存在,且k1等于value1,k2不等于value2时,输出响应体match condition。

ne

函数详细信息,请参见下表:

项目描述
语法ne(arg1, arg2)。
说明比较2个参数是否不等。
参数
  • arg1:任意类型。

  • arg2:应与arg1类型相同。

返回值参数不等返回true,否则返回false。
示例


key1 = 'value1'key2 = 'value2'if and($arg_k1, $arg_k2, eq(key1, $arg_k1), ne(key2, $arg_k2)) {
    say('match condition')
}
  • 请求参数k1和k2都存在时,执行后续的比较操作。

  • 请求参数k1或k2不存在时,短路语义生效,不再执行后续的比较操作。

  • eq: 请求参数k1的值是否等于value1。

  • ne: 请求参数k2的值不等于value2。

  • 当请求参数k1和k2均存在,且k1等于value1,k2不等于value2时,输出响应体match condition。

null

函数详细信息,请参见下表:


项目描述
语法null(v)。
说明判断ES数据类型是否为空。
参数v:需要传入的参数,类型为数组、字典和字符串,其他类型均返回false。
返回值返回值为bool类型
  • v是数组和字典,如果为空,返回true。

  • v是字符串,如果值为空串"",返回true。

  • 其他情况均返回false。

示例


d = []
say(null(d))set(d, 1, 'v1')
say(null(d))
say(tostring(null('x')))
say(tostring(null('')))
输出:


truefalsefalsetrue


-EOF-