このトピックでは、ホットリンク保護、ホワイトリスト、ブラックリスト、リクエストヘッダー、レスポンスヘッダー、書き換え、リダイレクト、リモート認証などの一般的なシナリオでカスタム転送ルールを作成する方法について説明します。 このトピックでは、シナリオのサンプルスクリプトも提供します。
ホットリンク保護
カスタム認証アルゴリズムの設定
次の例は、カスタム認証アルゴリズムを設定する方法を示しています。
要件
リクエストURL形式:
/path/digest/?.tskey=&t=
. ts
カスタムホットリンク保護を設定するための要件は次のとおりです。ルール1: リクエストに
t
またはkey
パラメーターが含まれていない場合、HTTP 403ステータスコードが返され、失敗の原因を示すためにX-AUTH-MSG
レスポンスヘッダーが追加されます。ルール2:
t
パラメーターは、絶対有効期限を指定します。t
で指定された時刻が現在の時刻より前の場合、HTTP 403ステータスコードが返され、失敗の原因を示すためにX-AUTH-MSG
レスポンスヘッダーが追加されます。ルール3:
md5
値をダイジェスト
値と比較します。md5
値がdigest
値と一致しない場合、HTTP 403ステータスコードが返されます。md5値の値の形式:
Private key + Path + File name.extension
サンプルスクリプト
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ブラックリストを設定する方法を示しています。
要件: リクエストに
ijkplayer
またはYsten
で始まるUser-Agent
ヘッダーが含まれている場合、HTTPステータスコード403が返されます。サンプルスクリプト
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 ***
でない場合、HTTP 403ステータスコードが返されます。サンプルスクリプト
if and($http_referer, match($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のステータスコードが返されます。サンプルスクリプト
一致する場合は
if match($remote_addr, '127.0.0.1|10.0.0.1') { add_rsp_header('X-IPBLOCK-DEBUG', 'hit') exit(403) }
カスタムリクエストヘッダーとレスポンスヘッダー
ファイルの自動名前変更の設定
次の例は、ファイルの自動名前変更を設定する方法を示しています。
要件:
filename
パラメーターが指定されている場合、ファイルはfilename
パラメーターで指定された値に自動的に名前が変更されます。 filenameパラメータが指定されていない場合、デフォルトのファイル名が使用されます。サンプルスクリプト
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)))
説明レスポンスヘッダー
Content-Disposition:attachment
をHTTPレスポンスに追加して、メッセージ本文を自動的にダウンロードできます。 さらに、応答にfilename
パラメーターが含まれている場合、ファイルは自動的にfilename
の値に名前が変更されます。 応答にfilenameパラメータが含まれていない場合は、デフォルトの名前が使用されます。ASCIIで二重引用符 ("") で囲まれた
filename
値は、ToCharを使用して文字列に変換できます。 二重引用符 ("") のASCIIコードは34です。
出力:
Content-Disposition: attachment;filename="monitor.apk"
応答ヘッダーの上書き
次の例は、レスポンスヘッダーを上書きする方法を示しています。
要件: レスポンスヘッダー
Content-Typ
を上書きします。サンプルスクリプト
add_rsp_header('Content-Type', 'audio/mpeg')
カスタム書き換えとリダイレクト
URIの書き換え
次の例は、URIを書き換える方法を示しています。
要件: ユーザーリクエストの
/hello
を/index.html
に書き換えます。 その結果、back-to-originリクエストのURIとキャッシュされたURIが/index.html
に変更されます。 他のパラメータは変わらない。サンプルスクリプト
if match($uri, '^/hello$') { rewrite('/index.html', 'break') }
ファイル拡張子の書き換え
次の例は、ファイル拡張子を書き換える方法を示しています。
要件:
/1.txt
を/1.<URLパラメータータイプ>
に書き換えます。 たとえば、/1.txt? type=mp4
は、back-to-originリクエストで/1.mp4?type=mp4
に書き換えられ、キャッシュされます。サンプルスクリプト
if and(match($uri, '^/1.txt$'), $arg_type) { rewrite(concat('/1.', $arg_type), 'break') }
ファイル拡張子を小文字に変換する
次の例は、ファイル拡張子を小文字に変換する方法を示しています。
要件: URI文字列を小文字に変換します。
サンプルスクリプト
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/(.*)
を/3rd/nn_live/$1
に書き換えます。サンプルスクリプト
pcs = capture($uri, '^/nn_live/(.*)') sec = get(pcs, 1) if sec { dst = concat('/3rd/nn_live/', sec) rewrite(dst, 'break') }
302リダイレクトの実行
次の例は、302リダイレクトを実行する方法を示しています。
要件:
/
rootディレクトリから/app/movie/pages/index/index.html
への302リダイレクトを実行します。サンプルスクリプト
if eq($uri, '/') { rewrite('/app/movie/pages/index/index.html', 'redirect') }
HTTPSへの302リダイレクトの実行
次の例は、HTTPSへの302リダイレクトを実行する方法を示しています。
要件
^/$
のルートディレクトリに一致する次のURIを https://aliyun.com にリダイレクトします。http://rtmp.cdnpe.com
https://rtmp.cdnpe.com
ビジネス要件に基づいて、リダイレクト先のURIをカスタム値に置き換えることができます。
サンプルスクリプト
if eq($uri, '/') { rewrite('https://aliyun.com', 'redirect') }