このトピックでは、トラフィック転送ルールをカスタマイズするための 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 の値は、
秘密鍵 + パス + ファイル名.拡張子として計算されます。
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_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' 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リクエストヘッダーがijkplayerまたはYstenで始まる場合、状態コード 403 を返します。AScript ルール:
if and($http_user_agent, match_re($http_user_agent, '^(ijkplayer|Ysten).*$')) { add_rsp_header('X-BLOCKLIST-DEBUG', 'deny') exit(403) }
Referer ホワイトリスト
要件:
refererヘッダーがhttp[s]://***alibaba.com***と一致しない場合、状態コード 403 を返します。AScript ルール:
if and($http_referer, match_re($http_referer, '^(http|https)://(.)+\.alibaba\.com.*$')) { return true } add_rsp_header('X-WHITELIST-DEBUG', 'missing') exit(403)
ブラックリストとホワイトリスト
IP ブラックリスト
要件: リクエストが IP アドレス
127.0.0.1または10.0.0.1から送信された場合、状態コード 403 を返します。AScript ルール:
if match_re($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 の再書き込み
要件:
/helloへのユーザーリクエストを内部で/index.htmlに再書き込みします。これにより、オリジンフェッチ URI とキャッシュ URI の両方が/index.htmlに変更されます。元のリクエストパラメーターは保持されます。AScript ルール:
if match_re($uri, '^/hello$') { rewrite('/index.html', 'break') }
ファイル拡張子の再書き込み
要件:
/1.txtへのユーザーリクエストを内部で/1.<type URL パラメーターの値>に再書き込みします。たとえば、/1.txt?type=mp4へのリクエストは、オリジンフェッチとキャッシュのために/1.mp4?type=mp4に再書き込みされます。AScript ルール:
if and(match_re($uri, '^/1.txt$'), $arg_type) { rewrite(concat('/1.', $arg_type), 'break') }
ファイル拡張子の小文字化
要件: URI 全体を小文字に変換します。
AScript ルール:
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/(.*)からのユーザーリクエストを内部で/3rd/nn_live/$1に再書き込みします。AScript ルール:
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ページに転送します。AScript ルール:
if eq($uri, '/') { rewrite('/app/movie/pages/index/index.html', 'redirect') }
HTTPS への 302 リダイレクト
要件:
ルートディレクトリ (
^/$) に一致する URI をリダイレクトします。http://rtmp.cdnpe.comhttps://rtmp.cdnpe.com
デフォルトでは、リクエストは
https://aliyun.comにリダイレクトされます。宛先 URI はカスタマイズできます。AScript ルール:
if eq($uri, '/') { rewrite('https://aliyun.com', 'redirect') }
トラブルシューティング
x-request-id の追加
要件: AScript を使用して
x-request-idを生成します。この ID をリクエストとレスポンスの両方に追加して、リクエストのトレースとトラブルシューティングを容易にします。AScript ルール:
requestid=md5(concat(rand(1, 10000), now())) add_req_header('x-request-id', requestid) add_rsp_header('x-request-id', requestid)