AScript場景示例
當您在防盜鏈、黑白名單、定制化請求頭和響應頭控制、定制化改寫和重定向、遠程鑒權(quán)等場景下,需要自定義轉(zhuǎn)發(fā)規(guī)則時,您可參考本文AScript示例代碼按需自定義您的流量請求轉(zhuǎn)發(fā)規(guī)則。
防盜鏈需求
自定義鑒權(quán)算法
自定義鑒權(quán)算法場景示例:
需求:
請求URL格式:
/path/digest/?.tskey=&t=
。針對
.ts
類請求,自定義防盜鏈需求如下:規(guī)則1:參數(shù)
t
或參數(shù)key
不存在,響應403,增加響應頭X-AUTH-MSG
標識鑒權(quán)失敗原因。規(guī)則2:參數(shù)
t
表示絕對過期時間,若參數(shù)t
小于當前時間,則響應403,增加響應頭X-AUTH-MSG
標識鑒權(quán)失敗原因。規(guī)則3:
md5
與digest
匹配。若md5
與digest
不匹配,響應403。md5取值格式為:
私鑰 + path + 文件名.后綴
。
對應的AScript規(guī)則:
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規(guī)則:
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規(guī)則:
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規(guī)則:
if match($remote_addr, '127.0.0.1|10.0.0.1') { add_rsp_header('X-IPBLOCK-DEBUG', 'hit') exit(403) }
定制化請求頭和響應頭控制
文件自動重命名
文件自動重命名場景示例:
需求:當有參數(shù)
filename
時,自動重命名為filename
,無參數(shù)時,使用默認命名。對應的AScript規(guī)則:
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
來實現(xiàn)消息體的強制下載,并且有參數(shù)filename
時,自動重命名為filename
,無參數(shù)時,使用默認命名。filename
增加雙引號,雙引號的ASCII編碼為34,可經(jīng)tochar轉(zhuǎn)回字符串。
輸出:
Content-Disposition: attachment;filename="monitor.apk"
覆蓋源站響應頭
覆蓋源站響應頭場景示例:
需求:覆蓋源站
Content-Type
響應頭。對應的AScript規(guī)則:
add_rsp_header('Content-Type', 'audio/mpeg')
定制化改寫和重定向
精確URI改寫
精確URI改寫場景示例:
需求:將用戶請求
/hello
內(nèi)部改寫成/index.html
,回源和緩存的URI都將變成/index.html
,參數(shù)保持原樣。對應的AScript規(guī)則:
if match($uri, '^/hello$') { rewrite('/index.html', 'break') }
文件后綴改寫
文件后綴改寫場景示例:
需求:將用戶請求
/1.txt
內(nèi)部改寫成/1.<url參數(shù)type>
。例如:/1.txt?type=mp4
將會被改成/1.mp4?type=mp4
回源并緩存。對應的AScript規(guī)則:
if and(match($uri, '^/1.txt$'), $arg_type) { rewrite(concat('/1.', $arg_type), 'break') }
文件后綴小寫化
文件后綴小寫化場景示例:
需求:將URI改成小寫。
對應的AScript規(guī)則:
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/(.*)
內(nèi)部改寫為/3rd/nn_live/$1
。對應的AScript規(guī)則:
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規(guī)則:
if eq($uri, '/') { rewrite('/app/movie/pages/index/index.html', 'redirect') }
302重定向HTTPS
302重定向HTTPS場景示例:
需求:
將以下URI(對根目錄匹配,
^/$
)http://rtmp.cdnpe.com
https://rtmp.cdnpe.com
跳轉(zhuǎn)到
https://aliyun.com
,跳轉(zhuǎn)后的URI可按需填寫。對應的AScript規(guī)則:
if eq($uri, '/') { rewrite('https://aliyun.com', 'redirect') }