このトピックでは、認証ロジックのカスタマイズ、リクエストヘッダーとレスポンスヘッダーのカスタマイズ、書き換えとリダイレクトのカスタマイズ、キャッシュコントロールのカスタマイズ、スロットリングのカスタマイズなど、EdgeScriptの使用シナリオについて説明します。
認証ルールのカスタマイズ
次の例は、認証ルールをカスタマイズする方法を示しています。
使用シナリオ
リクエストURL形式:
/path/digest/?.ts?key=&t=
のため。ts
要求、ホットリンク保護をカスタマイズするための要件は次のとおりです。ルール1: リクエストに
t
またはkey
パラメーターが含まれていない場合、POP (point of presence) はHTTP 403ステータスコードを返し、障害の原因を示すX-AUTH-MSG
レスポンスヘッダーを追加します。ルール2:
t
パラメーターは有効期限を指定します。 指定されたt
パラメーターが現在の時刻より前の場合、POPはHTTP 403ステータスコードを返し、失敗の原因を示すX-AUTH-MSG
レスポンスヘッダーを追加します。 この認証では、クライアントで取得されたタイムスタンプとCDN POPとの間にギャップがあり、認証が失敗する可能性があることに注意してください。ルール3:
md5
(プライベートキー + パス + ファイル名. ファイル名拡張子) ==digest
。 md5がダイジェスト
と一致しない場合、POPはHTTP 403ステータスコードを返します。
Script
# 認証タイプの決定 if eq(substr($uri, -3, -1), '.ts) { # パラメーターが存在するかどうかの確認 if or(not($arg_t) 、not($arg_key)) { add_rsp_header('X-AUTH-MSG '、'auth failed - missing need 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) } キー='b98d643a-9170-4937-8524-6c33514bbc23' # 連結された認証文字列に署名する signstr = concat(key, sec1, sec3) digest = md5(signstr) # 署名とリクエストのトークン文字列を比較する if ne (ダイジェスト, 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)))
レスポンスヘッダーContent-Disposition:attachmentをHTTPレスポンスに追加して、メッセージ本文を自動的にダウンロードできます。 さらに、レスポンスに
filename
パラメーターが含まれている場合は、自動的にfilename
に名前が変更されます。 応答にfilenameパラメータが含まれていない場合は、デフォルトの名前が使用されます。filename
パラメーターの値は、二重引用符 ("") で囲まれています。 文字列「34」は、二重引用符のASCII文字列である。 tochar関数を使用して、引用符文字列 ("") に戻すことができます。
出力:
Content-Disposition: attachment;filename="monitor.apk"
スクリプト:
if $arg_filename {
hn = 'Content-Disposition'
hv = concat('attachment;filename=', $arg_filename)
add_rsp_header(hn, hv)
}
書き換えとリダイレクトのカスタマイズ
次の例は、書き換えとリダイレクトをカスタマイズする方法を示しています。
URIを書き直します。
使用シナリオ
CDN を有効にして、
/hello
を/index.html
に書き換えます。 その結果、back-to-originリクエストのURIは/index.html
に変更され、パラメーターは変更されません。Script
if match_re($uri, '^/hello$') { 書き換え ('/index.html', 'break') }
ファイル拡張子を書き直します。
使用シナリオ
Alibaba Cloud CDNを有効にして、CDN POPでURI
/1.txt
を/1.<URL parameter type>
に書き換えます。 その結果、URIのファイル名拡張子は、リクエストURLのtypeパラメーターの値に置き換えられます。 たとえば、リクエストがオリジンサーバーにリダイレクトされる前に、/1.txt? type=mp4
が/1.mp4?type=mp4
に変更されます。 次に、取得したコンテンツはCDN POPにキャッシュされます。Script
if and(match_re($uri, '^/1.txt$'), $arg_type) { rewrite(concat('/1.', $arg_type), 'break ') }
ファイル拡張子を小文字に変換します。
使用シナリオ
URI文字列を小文字に変換します。
Script
pcs = capture_re($uri, '^(.+ %.)([^.]+)') section = get(pcs, 1) postfix = get(pcs, 2) if and (セクション、postfix) { rewrite(concat (セクション、lower(postfix)) 、'break') }
URIプレフィックスを追加します。
使用シナリオ
Alibaba Cloud CDNを有効にして、CDN POPで
^/nn_live/(.*)
を/3rd/nn_live/$1
に書き換えます。Script
pcs = capture_re($uri, '^/nn_live/(.*)') sec = get(pcs、1) if sec { dst = concat('/3rd/nn_live/' 、sec) rewrite(dst, 'break') }
302リダイレクトの実行
使用シナリオ
/
rootディレクトリから/app/movie/pages/index/index.html
への302リダイレクトを実行します。Script
if eq($uri, '/') { 書き換え ('/app/movie/pages/index/index.html' 、'redirect') }
HTTPS URIへの302リダイレクトの実行
使用シナリオ
^/$
のルートディレクトリに一致する次のURIをhttps://rtmp.cdnpe.com/index.html
にリダイレクトします。 必要に応じて最終URIを指定できます。http://demo.aliyundoc.com
https://demo.aliyundoc.com
Script
if eq($uri, '/') { 書き換え ('https:// demo.aliyundoc.com/index.html' 、'redirect') }
キャッシュ制御のカスタマイズ
次の例は、キャッシュされたリソースの有効期限 (TTL) 値をカスタマイズする方法を示しています。
使用シナリオ
さまざまな条件に基づいて、キャッシュされたリソースのTTL値をカスタマイズします。
Script
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で始まるURLの場合、HTTP 301ステータスコードのTTL値を10秒、HTTP 302ステータスコードのTTL値を5秒に設定します。
調整ポリシーのカスタマイズ
次に、スロットリングポリシーをカスタマイズする例を示します。
使用シナリオ
sp
とunit
パラメーターが設定されている場合、スロットリングが実装されます。sp
パラメーターは、スロットリングがトリガーされる前の最大しきい値を指定します。unit
パラメーターは、ユニットを指定します。 単位はKBまたはMBです。Script
ifおよび ($arg_sp, $arg_unit) { sp = tonumber($arg_sp) if not(sp) { add_rsp_header('X-LIMIT-DEBUG ', 'invalid sp') falseを返します } if and(ne($arg_unit, 'k'), ne($arg_unit, 'm')) { add_rsp_header('X-LIMIT-DEBUG '、'invalid unit') falseを返します } add_rsp_header('X-LIMIT-DEBUG '、concat('set on: ' 、sp、$arg_unit)) limit_rate(sp、$arg_unit) trueを返す }
リージョンおよびISPベースのアクセス制御
リージョンおよびISPベースのアクセス制御の例を次に示します。
シナリオの使用
アクセス制御は、クライアント要求に含まれるIPアドレスの地域およびインターネットサービスプロバイダ (ISP) を識別することによって実施される。
クライアントIPアドレスのリージョンとISPを識別するには、次の機能を使用します。 詳細については、「ロジック関数のリクエスト」をご参照ください。
client_region
: クライアントIPアドレスのリージョンのコードを返します。client_isp
: クライアントIPアドレスのインターネットサービスプロバイダー (isp) のコードを返します。
Script
# リージョンの制限。 リージョンが一致しない場合、アクセスはブロックされます。 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) } # リージョンの制限。 ISPが一致しない場合、アクセスはブロックされます。 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) }