EdgeScript場景示例
本文為您介紹EdgeScript的定制化鑒權(quán)邏輯、定制化請求頭和響應(yīng)頭控制、定制化改寫和重定向、定制化緩存控制和定制化限速的場景示例。
定制化鑒權(quán)規(guī)則
自定義鑒權(quán)規(guī)則場景示例如下:
需求
請求URL格式:
/path/digest/?.ts?key=&t=
。針對
.ts
類請求,自定義防盜鏈需求如下:規(guī)則1:參數(shù)
t
或參數(shù)key
不存在,響應(yīng)403,增加響應(yīng)頭X-AUTH-MSG
標(biāo)識鑒權(quán)失敗原因。規(guī)則2:參數(shù)
t
表示過期時間,若參數(shù)t
小于當(dāng)前時間,則響應(yīng)403,增加響應(yīng)頭X-AUTH-MSG
標(biāo)識鑒權(quán)失敗原因(此類鑒權(quán)注意關(guān)注客戶端與CDN側(cè)取時間可能會有差異,客戶端請求URL中攜帶的時間快慢都可能會影響到鑒權(quán)結(jié)果,導(dǎo)致鑒權(quán)失敗)。規(guī)則3:
md5
(私鑰 + path + 文件名.后綴)==digest
;若digest
不匹配,響應(yīng)403。
對應(yīng)的EdgeScript規(guī)則
#鑒權(quán)類型的判斷 if eq(substr($uri, -3, -1), '.ts') { #參數(shù)是否存在判斷 if or(not($arg_t), not($arg_key)) { add_rsp_header('X-AUTH-MSG', 'auth failed - missing necessary arg') exit(403) } #是否為數(shù)字判斷 t = tonumber($arg_t) if not(t) { add_rsp_header('X-AUTH-MSG', 'auth failed - invalid time') exit(403) } #鑒權(quán)時間是否過期判斷 if gt(now(), t) { add_rsp_header('X-AUTH-MSG', 'auth failed - expired url') exit(403) } #鑒權(quán)算法,對請求進(jìn)行正則提取 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' #待簽算的鑒權(quán)串拼接 signstr = concat(key, sec1, sec3) digest = md5(signstr) #簽算和請求中的token串比較 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) } }
定制化請求頭和響應(yīng)頭控制
文件自動重命名場景示例如下:
示例:
add_rsp_header('Content-Disposition', concat('attachment;filename=', tochar(34), filename, tochar(34)))
通過在HTTP應(yīng)答中添加響應(yīng)頭“Content-Disposition:attachment”來實現(xiàn)消息體的強(qiáng)制下載,并且有參數(shù)
filename
時,自動重命名為filename
,無參數(shù)時,使用默認(rèn)命名。filename
增加雙引號,34為雙引號的ascii,可經(jīng)tochar轉(zhuǎn)回字符串。
輸出:
Content-Disposition: attachment;filename="monitor.apk"
對應(yīng)的EdgeScript規(guī)則:
if $arg_filename {
hn = 'Content-Disposition'
hv = concat('attachment;filename=', $arg_filename)
add_rsp_header(hn, hv)
}
定制化改寫和重定向
定制化改寫和重定向場景示例如下:
精確URI改寫
需求
將用戶請求
/hello
在CDN內(nèi)部改寫成/index.html
,回源和緩存的URI都將變成/index.html
,參數(shù)保持原樣。對應(yīng)的EdgeScript規(guī)則
if match_re($uri, '^/hello$') { rewrite('/index.html', 'break') }
文件后綴改寫
需求
將用戶請求的URI信息
/1.txt
,在CDN節(jié)點上改寫成/1.<url參數(shù)type>
,即,使用請求URL中攜帶的type參數(shù)值來替換URI中的文件后綴,例如:/1.txt?type=mp4
將會被改成/1.mp4?type=mp4
然后回源獲取文件,并緩存在CDN節(jié)點上。對應(yīng)的EdgeScript規(guī)則
if and(match_re($uri, '^/1.txt$'), $arg_type) { rewrite(concat('/1.', $arg_type), 'break') }
文件后綴小寫化
需求
將URI改成小寫。
對應(yīng)的EdgeScript規(guī)則
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節(jié)點上改寫為/3rd/nn_live/$1
。對應(yīng)的EdgeScript規(guī)則
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
頁面。對應(yīng)的EdgeScript規(guī)則
if eq($uri, '/') { rewrite('/app/movie/pages/index/index.html', 'redirect') }
302重定向HTTPS
需求
將如下URI(對根目錄匹配,
^/$
)跳轉(zhuǎn)到https://demo.aliyundoc.com/index.html
,跳轉(zhuǎn)后的URI可按需填寫。http://demo.aliyundoc.com
https://demo.aliyundoc.com
對應(yīng)的EdgeScript規(guī)則
if eq($uri, '/') { rewrite('https://demo.aliyundoc.com/index.html', 'redirect') }
定制化緩存控制
自定義緩存時長的場景樣例如下:
需求
根據(jù)各類條件,自定義資源緩存時長。
對應(yīng)的EdgeScript規(guī)則
if match_re($uri, '^/image') { set_cache_ttl('code', '301=10,302=5') } if eq(substr($uri, -4, -1), '.mp4') { set_cache_ttl('path', 5) } if match_re($uri, '^/201801/mp4/') { set_cache_ttl('path', 50) } if match_re($uri, '^/201802/flv/') { set_cache_ttl('path', 10) }
說明/image開頭的URI,針對響應(yīng)碼設(shè)置緩存時長,301緩存10s,302緩存5s。
定制化限速
自定義限速值的場景樣例如下:
需求
如果有參數(shù)
sp
和unit
,則實施限速。sp
參數(shù)指明限速數(shù)值,unit
為參數(shù)單位,KB或MB。對應(yīng)的EdgeScript規(guī)則
if and($arg_sp, $arg_unit) { sp = tonumber($arg_sp) if not(sp) { add_rsp_header('X-LIMIT-DEBUG', 'invalid sp') return false } if and(ne($arg_unit, 'k'), ne($arg_unit, 'm')) { add_rsp_header('X-LIMIT-DEBUG', 'invalid unit') return false } add_rsp_header('X-LIMIT-DEBUG', concat('set on: ', sp, $arg_unit)) limit_rate(sp, $arg_unit) return true }
區(qū)域、運(yùn)營商訪問限制
區(qū)域、運(yùn)營商訪問限制的場景樣例如下:
需求
通過識別客戶端請求中攜帶的IP地址的區(qū)域、運(yùn)營商歸屬來實現(xiàn)訪問限制。
識別客戶端IP的區(qū)域、運(yùn)營商歸屬的函數(shù)如下。詳細(xì)請參見請求判斷相關(guān)。
client_region
:使用該函數(shù)可以返回客戶端IP歸屬地區(qū)的編碼。client_isp
:使用該函數(shù)可以返回客戶端IP歸屬運(yùn)營商的編碼。
對應(yīng)的EdgeScript規(guī)則
# 省份限制,省份不匹配的,禁止訪問 ip_region_id=client_region() if not(match_re(ip_region_id, '440000|370000')) { add_rsp_header('X-REGION-BLOCK-DEBUG', concat('hit ip_region_id:', ip_region_id)) exit(403) } # 運(yùn)營商限制,運(yùn)營商不匹配的,禁止訪問 ip_isp_id=client_isp() if not(match_re(ip_isp_id, '100017|100025')) { add_rsp_header('X-REGION-BLOCK-DEBUG', concat('hit ip_isp_id:', ip_isp_id)) exit(403) }
EdgeScript配置示例操作視頻
本視頻以配置域名自定義限速策略為例,演示通過CDN控制臺給域名配置EdgeScript邊緣腳本的整個流程,包括添加邊緣腳本、發(fā)布邊緣腳本到模擬環(huán)境、測試模擬環(huán)境功能、發(fā)布邊緣腳本到生產(chǎn)環(huán)境和測試生產(chǎn)環(huán)境功能。