本文为您介绍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 + 文件名.后缀
。
- 规则1:参数
- 请求URL格式:
- 对应的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转回字符串。
- 通过在HTTP应答中添加响应头
- 输出:
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.
。例如:/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')}
远程鉴权
自定义远程鉴权
自定义远程鉴权场景示例:
- 需求:根据请求发送的数据格式,获得响应结果,决定当前请求是否放过。
- 对应的AScript规则:
auth_addr = 'http://xx.cn/outer/cdn/checkplay?host=' remote_addr_t = '' if $remote_addr { remote_addr_t = $remote_addr } sp = '' if $arg_sp { sp = $arg_sp } token = '' if $arg_token { token = $arg_token } auth_key = '' if $arg_auth_key { auth_key = $arg_auth_key } t_cookie = '' if $http_cookie { t_cookie = $http_cookie } referer = '' if $http_referer { referer = $http_referer } range = '' if $http_range { range = $http_range } auth_addr = concat(auth_addr, $host, '&ip=', remote_addr_t, '&sp=', sp, '&token=', token, '&auth_key=', auth_key, '&cookie=', t_cookie, '&referer=', referer, '&range=', range) req_info = [] set(req_info, 'addr', auth_addr) set(req_info, 'retry', 1) set(req_info, 'timeout', 1000) set(req_info, 'method', 'POST') req_header = [] set(req_header, 'Connection', 'close') set(req_info, 'send_headers', req_header) rs = http_request(req_info) if rs { code = get(rs, 'code') if eq(code, '403') { exit(403) } headers = get(rs, 'headers') if headers { x_limit_rate_after = get(headers, 'x-limit-rate-after') if and(x_limit_rate_after, match_re(x_limit_rate_after, '\d+(k|m|g)$')) { num = substr(x_limit_rate_after, 1, -2) unit = substr(x_limit_rate_after, -1, -1) limit_rate_after(tonumber(num), unit) } x_speed = get(headers, 'x-speed') if and(x_speed, match_re(x_speed, '\d+(k|m|g)$')) { num = substr(x_speed, 1, -2) unit = substr(x_speed, -1, -1) limit_rate(tonumber(num), unit) } } }
内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家
阿里云企业补贴进行中: 马上申请
腾讯云限时活动1折起,即将结束: 马上收藏
同尘科技为腾讯云授权服务中心。
购买腾讯云产品享受折上折,更有现金返利:同意关联,立享优惠
转转请注明出处:https://www.yunxiaoer.com/169256.html