当您在防盗链、黑白名单、定制化请求头和响应头控制、定制化改写和重定向、远程鉴权等场景下,需要自定义转发规则时,您可参考本文AScript示例代码按需自定义您的流量请求转发规则。
防盗链需求
自定义鉴权算法
自定义鉴权算法场景示例:
需求:
请求URL格式:
/path/digest/?.tskey=&t=
。针对
.ts
类请求,自定义防盗链需求如下:规则1:参数
t
或参数key
不存在,响应403,增加响应头X-AUTH-MSG
标识鉴权失败原因。规则2:参数
t
表示绝对过期时间,若参数t
小于当前时间,则响应403,增加响应头X-AUTH-MSG
标识鉴权失败原因。规则3:
md5
与digest
匹配。若md5
与digest
不匹配,响应403。md5取值格式为:
私钥 + path + 文件名.后缀
。
对应的AScript规则:
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($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) } }
User-Agent黑名单
User-Agent黑名单场景示例:
需求:当请求
User-Agent
以ijkplayer
开头,或者以Ysten
开头,则响应403。对应的AScript规则:
if and($http_user_agent, match($http_user_agent, '^[ijkplayer|Ysten].*$')) { add_rsp_header('X-BLOCKLIST-DEBUG', 'deny') exit(403) }
Referer白名单
Referer白名单场景示例:
需求:当
referer
不是http[s]://***alibaba.com***
时,响应403。对应的AScript规则:
if and($http_referer, match($http_referer, '^(http|https)://(.)+\.alibaba\.com.*$')) { return true } add_rsp_header('X-WHITELIST-DEBUG', 'missing') exit(403)
黑白名单
IP黑名单
IP黑名单场景示例:
需求:当请求客户端IP为
127.0.0.1
、或者为10.0.0.1
时,响应403。对应的AScript规则:
if match($remote_addr, '127.0.0.1|10.0.0.1') { add_rsp_header('X-IPBLOCK-DEBUG', 'hit') exit(403) }
定制化请求头和响应头控制
文件自动重命名
文件自动重命名场景示例:
需求:当有参数
filename
时,自动重命名为filename
,无参数时,使用默认命名。对应的AScript规则:
if $arg_filename { hn = 'Content-Disposition' hv = concat('attachment;filename=', $arg_filename) add_rsp_header(hn, hv) }
示例:
add_rsp_header('Content-Disposition', concat('attachment;filename=', tochar(34), filename, tochar(34)))
说明通过在HTTP应答中添加响应头
Content-Disposition:attachment
来实现消息体的强制下载,并且有参数filename
时,自动重命名为filename
,无参数时,使用默认命名。filename
增加双引号,双引号的ASCII编码为34,可经tochar转回字符串。
输出:
Content-Disposition: attachment;filename="monitor.apk"
覆盖源站响应头
覆盖源站响应头场景示例:
需求:覆盖源站
Content-Type
响应头。对应的AScript规则:
add_rsp_header('Content-Type', 'audio/mpeg')
定制化改写和重定向
精确URI改写
精确URI改写场景示例:
需求:将用户请求
/hello
内部改写成/index.html
,回源和缓存的URI都将变成/index.html
,参数保持原样。对应的AScript规则:
if match($uri, '^/hello$') { rewrite('/index.html', 'break') }
文件后缀改写
文件后缀改写场景示例:
需求:将用户请求
/1.txt
内部改写成/1.<url参数type>
。例如:/1.txt?type=mp4
将会被改成/1.mp4?type=mp4
回源并缓存。对应的AScript规则:
if and(match($uri, '^/1.txt$'), $arg_type) { rewrite(concat('/1.', $arg_type), 'break') }
文件后缀小写化
文件后缀小写化场景示例:
需求:将URI改成小写。
对应的AScript规则:
pcs = capture($uri, '^(.+%.)([^.]+)') section = get(pcs, 1) postfix = get(pcs, 2) if and(section, postfix) { rewrite(concat(section, lower(postfix)), 'break') }
添加URI前缀
添加URI前缀场景示例:
需求:将用户请求
^/nn_live/(.*)
内部改写为/3rd/nn_live/$1
。对应的AScript规则:
pcs = capture($uri, '^/nn_live/(.*)') sec = get(pcs, 1) if sec { dst = concat('/3rd/nn_live/', sec) rewrite(dst, 'break') }
302重定向
302重定向场景示例:
需求:将根目录
/
,302重定向到/app/movie/pages/index/index.html
页面。对应的AScript规则:
if eq($uri, '/') { rewrite('/app/movie/pages/index/index.html', 'redirect') }
302重定向HTTPS
302重定向HTTPS场景示例:
需求:
将以下URI(对根目录匹配,
^/$
)http://rtmp.cdnpe.com
https://rtmp.cdnpe.com
跳转到
https://aliyun.com
,跳转后的URI可按需填写。对应的AScript规则:
if eq($uri, '/') { rewrite('https://aliyun.com', 'redirect') }