このドキュメントでは、ホットリンク保護、ブラックリストとホワイトリスト、カスタムリクエスト/レスポンスヘッダー制御、再書き込み、リダイレクトなどのシナリオにおけるトラフィック転送ルールをカスタマイズするための AScript サンプルコードを提供します。
ホットリンク保護
カスタム認証アルゴリズム
-
要件:
-
リクエスト URL 形式:
/path/digest/?.tskey=&t=。 -
.tsリクエストの場合、以下のホットリンク保護ルールを実装します。-
ルール 1:
tまたはkeyパラメーターが不足している場合、HTTP ステータスコード 403 を返し、認証失敗の理由を示すX-AUTH-MSGレスポンスヘッダーを追加します。 -
ルール 2:
tパラメーターは絶対有効期限を指定します。tが現在時刻より前の場合、HTTP ステータスコード 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で始まる場合、HTTP ステータスコード 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***でない場合、HTTP ステータスコード 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の場合、HTTP ステータスコード 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 の両方が/index.htmlになり、クエリパラメーターは変更されないままになります。 -
対応する AScript ルール:
if match_re($uri, '^/hello$') { rewrite('/index.html', 'break') }
ファイル拡張子の再書き込み
-
要件: ユーザーリクエストの
/1.txtを/1.<URL parameter type>に再書き込みします。例えば、/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 リダイレクト
-
要件: ルートディレクトリ
/から/app/movie/pages/index/index.htmlへの 302 リダイレクトを実行します。 -
対応する AScript ルールは以下のとおりです。
if eq($uri, '/') { rewrite('/app/movie/pages/index/index.html', 'redirect') }
HTTPS への 302 リダイレクト
-
要件:
ルートディレクトリパターン
^/$に一致する以下の URI をリダイレクトします。-
http://rtmp.cdnpe.com -
https://rtmp.cdnpe.com
https://aliyun.comにリダイレクトします。必要に応じて、リダイレクト先 URI を指定できます。 -
-
対応する AScript ルールは以下のとおりです。
if eq($uri, '/') { rewrite('https://aliyun.com', 'redirect') }
URL リダイレクト (URI パラメーターなし)
-
要件:
www.test.comへのリクエストを、元の URI パラメーターを保持せずにwww.example.comにリダイレクトします。 -
対応する AScript ルールは以下のとおりです。
if and(eq(req_header('Host'), 'www.test.com')) { rewrite('www.example.com', 'redirect') }結果: リダイレクト後、URI パラメーターは失われますが、URI の末尾に疑問符が残ります。
末尾の疑問符の削除
-
対応する AScript ルールは以下のとおりです。
if and(eq(req_header('Host'), 'www.test.com')) { rewrite('www.example.com', 'enhance_redirect') }
URL リダイレクト (URI パラメーターあり)
-
要件:
www.test.comへのリクエストを、元の URI パラメーターを保持したままwww.example.comにリダイレクトします。 -
対応する AScript ルール:
if and(eq(req_header('Host'), 'www.test.com')) { rewrite(concat('www.example.com', $uri), 'enhance_redirect') }
ワイルドカードドメイン名に対する正規表現マッチング (URI サフィックスの追加)
-
要件: ビジネスで複数のドメイン名を使用している場合、正規表現マッチングを使用してワイルドカードドメイン名を識別し、特定の URI サフィックスパラメーターを追加することで、構成作業を削減できます。
-
対応する AScript ルール:
host_re = match_re(req_header('Host'), '.*.test.com') url_match = null(find($uri, 'index.php')) if and(host_re, url_match) { rewrite(concat($host, '/index.php?s=', $uri), 'enhance_redirect') }
HTTP から HTTPS へのリダイレクト (クエリパラメーターの削除)
-
要件:
http://www.test.com/tmp/?a=bをhttps://www.test.comにリダイレクトし、リクエストからすべてのクエリパラメーターを削除します。 -
対応する AScript ルール:
host_re = match_re(req_header('Host'), 'www.test.com') url_match = not(null(find($request_uri, '?'))) # 無限リダイレクトの防止 if req_scheme('http') { if and(host_re, url_match) { rewrite('https://www.test.com', 'enhance_redirect') # ステータスコード 302 } }
トラブルシューティング
追加 x-request-id
-
要件: AScript を使用して
x-request-idの値を生成し、リクエストとレスポンスの両方に追加することで、リクエストの追跡とトラブルシューティングを簡素化します。 -
対応する AScript ルール:
requestid=md5(concat(rand(1, 10000), now())) add_req_header('x-request-id', requestid) add_rsp_header('x-request-id', requestid)