本文为您介绍多种场景下,EdgeScript规则的示例。
拉流FLV本地鉴权
- 需求
对
.flv
类请求,自定义防盗链需求如下:- 规则1:参数
sign
或参数expires
不存在,响应403,增加响应头X-AUTH-MSG
标识鉴权失败原因。 - 规则2:参数
t
表示过期时间,若参数t
小于当前时间,则响应403,增加响应头X-AUTH-MSG
标识鉴权失败原因。 - 规则3:md5与sign匹配,若不匹配,则响应403,增加响应头
X-AUTH-MSG
标识鉴权失败原因。
- 规则1:参数
- 参数说明
- expires:URL参数,Unix时间戳过期校验。必须大于服务器的当前时间。
- sign:签名字段,生成的规则为
sign=md5($uri + $expires + $secret)
。
- 对应的EdgeScript规则
secret='abc' if eq(substr($uri, -4, -1), '.flv') { if or(not($arg_sign), not($arg_expires)) { add_rsp_header('X-AUTH-MSG', 'auth failed - missing necessary arg') exit(403) } t = tonumber($arg_expires) if gt(now(), t) { add_rsp_header('X-AUTH-MSG', 'auth failed - expired url') exit(403) } digest = md5(concat($uri, $arg_expires, secret)) if ne(digest, $arg_sign) { add_rsp_header('X-AUTH-MSG', 'auth failed - invalid sign') exit(403) } }
拉流FLV黑名单
- 需求
UserAgent黑名单功能。
请求头名称中出现的
-
,需要使用_
替代,例如:X-USER-ID对应为x_user_id。 - 对应的EdgeScript规则
if eq(substr($uri, -4, -1), '.flv') { blacklist = [] set(blacklist, 'black1', 1) set(blacklist, 'black2', 1) ua = req_header('user_agent') if eq(get(blacklist, ua), 1) { exit(403) } }
拉流FLV IP粒度禁播
- 需求
禁止新加坡、中国台湾、珠海市、电信的用户IP播放。
说明 国家编码等信息,请参见附录。 - 对应的EdgeScript规则
if eq(substr($uri, -4, -1), '.flv') { c_country = client_country() c_region = client_region() c_city = client_city() c_isp = client_isp() if eq(c_country, 'SG') { exit(403) } if eq(c_region, 'TW_01') { exit(403) } if eq(tonumber(c_city), 440400) { exit(403) } if eq(tonumber(c_isp), 100017) { exit(403) } }
拉流FLV URI改写
- 需求
根据pattern参数,给URI添加上后缀。如:
pattern = 1, uri = /test/live.flv --> /test/live1.flv
- 对应的EdgeScript规则
if eq(substr($uri, -4, -1), '.flv') { if $arg_pattern { dst = concat(substr($uri, 1, -5), $arg_pattern, '.flv') rewrite(dst, 'break') } }
定制化鉴权逻辑
- 需求
- 请求URL格式:
/path/digest/?.ts?key=&t=
。 - 针对
.ts
类请求,自定义防盗链需求如下:- 规则1:参数
t
或参数key
不存在,响应403,增加响应头X-AUTH-MSG
标识鉴权失败原因。 - 规则2:参数
t
表示过期时间,若参数t
小于当前时间,则响应403,增加响应头X-AUTH-MSG
标识鉴权失败原因。 - 规则3:
md5
与digest
匹配。若md5
与digest
不匹配,响应403。md5取值格式为:
私钥 + path + 文件名.后缀
。
- 规则1:参数
- 请求URL格式:
- 对应的EdgeScript规则
if eq(substr($uri, -3, -1), '.ts') { if or(not($arg_t), not($arg_key)) { add_rsp_header('X-AUTH-MSG', 'auth failed - missing necessary arg') exit(403) } t = tonumber($arg_t) if not(t) { add_rsp_header('X-AUTH-MSG', 'auth failed - invalid time') exit(403) } if gt(now(), t) { add_rsp_header('X-AUTH-MSG', 'auth failed - expired url') exit(403) } pcs = capture_re($request_uri,'^/([^/]+)/([^/]+)/([^?]+)\?(.*)') sec1 = get(pcs, 1) sec2 = get(pcs, 2) sec3 = get(pcs, 3) if or(not(sec1), not(sec2), not(sec3)) { add_rsp_header('X-AUTH-MSG', 'auth failed - malformed url') exit(403) } key = 'b98d643a-9170-4937-8524-6c33514bbc23' signstr = concat(key, sec1, sec3) digest = md5(signstr) if ne(digest, sec2) { add_rsp_header('X-AUTH-DEBUG', concat('signstr: ', signstr)) add_rsp_header('X-AUTH-MSG', 'auth failed - invalid digest') exit(403) } }
定制化请求头和响应头控制
文件自动重命名场景示例如下:
示例:
add_rsp_header('Content-Disposition', concat('attachment;filename=', tochar(34), filename, tochar(34)))
- 通过在HTTP应答中添加响应头“Content-Disposition:attachment”来实现消息体的强制下载,并且有参数
filename
时,自动重命名为filename
,无参数时,使用默认命名。 filename
增加双引号,34为双引号的ascii,可经tochar转回字符串。
输出:
Content-Disposition: attachment;filename="monitor.apk"
对应的EdgeScript规则:
if $arg_filename {
hn = 'Content-Disposition'
hv = concat('attachment;filename=', $arg_filename)
add_rsp_header(hn, hv)
}
定制化改写和重定向
- 精确URI改写
- 需求
将用户请求
/hello
在CDN内部改写成/index.html
,回源和缓存的URI都将变成/index.html
,参数保持原样。 - 对应的EdgeScript规则
if match_re($uri, '^/hello$') { rewrite('/index.html', 'break') }
- 需求
- 文件后缀改写
- 需求
将用户请求的URI信息
/1.txt
,在CDN节点上改写成/1.<url参数type>
,即,使用请求URL中携带的type参数值来替换URI中的文件后缀,例如:/1.txt?type=mp4
将会被改成/1.mp4?type=mp4
然后回源获取文件,并缓存在CDN节点上。 - 对应的EdgeScript规则
if and(match_re($uri, '^/1.txt$'), $arg_type) { rewrite(concat('/1.', $arg_type), 'break') }
- 需求
- 文件后缀小写化
- 需求
将URI改成小写。
- 对应的EdgeScript规则
pcs = capture_re($uri, '^(.+%.)([^.]+)') section = get(pcs, 1) postfix = get(pcs, 2) if and(section, postfix) { rewrite(concat(section, lower(postfix)), 'break') }
- 需求
- 添加URI前缀
- 需求
将用户请求
^/nn_live/(.*)
,在CDN节点上改写为/3rd/nn_live/$1
。 - 对应的EdgeScript规则
pcs = capture_re($uri, '^/nn_live/(.*)') sec = get(pcs, 1) if sec { dst = concat('/3rd/nn_live/', sec) rewrite(dst, 'break') }
- 需求
- 302重定向
- 需求
将根目录
/
,302重定向到/app/movie/pages/index/index.html
页面。 - 对应的EdgeScript规则
if eq($uri, '/') { rewrite('/app/movie/pages/index/index.html', 'redirect') }
- 需求
- 302重定向HTTPS
- 需求
将如下URI(对根目录匹配,
^/$
)跳转到https://demo.aliyundoc.com/index.html
,跳转后的URI可按需填写。http://demo.aliyundoc.com
https://demo.aliyundoc.com
- 对应的EdgeScript规则
if eq($uri, '/') { rewrite('https://demo.aliyundoc.com/index.html', 'redirect') }
- 需求