EdgeScript は、HTTP リクエストヘッダーとレスポンスヘッダーの操作、URI の書き換えまたはリダイレクト、レスポンス本文の出力、Cookie の設定を行うための組み込み関数を提供します。このリファレンスでは、各関数の構文、パラメーター、戻り値、および使用例について説明します。
ジャンプ先:
リクエストヘッダー:
add_req_header、del_req_headerレスポンスヘッダー:
add_rsp_header、del_rsp_header、get_rsp_headerURL リライトとリダイレクト:
rewriteレスポンス本文:
say、print、exitCookie:
add_rsp_cookieエンコーディング:
encode_args、decode_args
リクエストヘッダー
add_req_header
リクエストがオリジンサーバーに転送される前に、リクエストヘッダーを追加します。
構文
add_req_header(name, value [, append])パラメーター
パラメーター | タイプ | 必須 | 説明 |
| string | はい | 追加するリクエストヘッダーの名前。 |
| string | はい | 追加するリクエストヘッダーの値。 |
| Boolean | いいえ | 同じ名前のヘッダーが既に存在する場合にヘッダーを追加するかどうかを指定します。デフォルト: |
戻り値
デフォルトでは true を返します。ヘッダー名が無効な場合は false を返します。
例
add_req_header('USER-DEFINED-REQ-1', '1')
add_req_header('USER-DEFINED-REQ-1', 'x', true)
add_req_header('USER-DEFINED-REQ-2', '2')
del_req_header('USER-DEFINED-REQ-2')結果: オリジンサーバーは次のヘッダーを受信します。
USER-DEFINED-REQ-1: 1
USER-DEFINED-REQ-1: xUSER-DEFINED-REQ-2 は追加された後に削除されるため、オリジンサーバーには転送されません。
del_req_header
リクエストがオリジンサーバーに転送される前に、リクエストヘッダーを削除します。
構文
del_req_header(name)パラメーター
パラメーター | タイプ | 必須 | 説明 |
| string | はい | 削除するリクエストヘッダーの名前。 |
戻り値
デフォルトでは true を返します。ヘッダー名が無効な場合は false を返します。
例
add_req_header('USER-DEFINED-REQ-1', '1')
add_req_header('USER-DEFINED-REQ-1', 'x', true)
add_req_header('USER-DEFINED-REQ-2', '2')
del_req_header('USER-DEFINED-REQ-2')結果: オリジンサーバーは次のヘッダーを受信します。
USER-DEFINED-REQ-1: 1
USER-DEFINED-REQ-1: xUSER-DEFINED-REQ-2 は追加された後に削除されるため、オリジンサーバーには転送されません。
レスポンスヘッダー
add_rsp_header
レスポンスヘッダーを追加します。
構文
add_rsp_header(name, value [, append])パラメーター
パラメーター | タイプ | 必須 | 説明 |
| string | はい | 追加するレスポンスヘッダーの名前。 |
| string | はい | 追加するレスポンスヘッダーの値。動的式をサポートしています。 |
| Boolean | いいえ | 同じ名前のヘッダーが既に存在する場合にヘッダーを追加するかどうかを指定します。デフォルト: |
戻り値
デフォルトでは true を返します。ヘッダー名が無効な場合は false を返します。
例
add_rsp_header('USER-DEFINED-RSP-1', '1')
add_rsp_header('USER-DEFINED-RSP-1', 'x', true)
add_rsp_header('USER-DEFINED-RSP-2', '2')
del_rsp_header('USER-DEFINED-RSP-2')結果: レスポンスには次のヘッダーが含まれます。
USER-DEFINED-RSP-1: 1
USER-DEFINED-RSP-1: xUSER-DEFINED-RSP-2 は追加された後に削除されるため、レスポンスには含まれません。
del_rsp_header
レスポンスヘッダーを削除します。
構文
del_rsp_header(name)パラメーター
パラメーター | タイプ | 必須 | 説明 |
| string | はい | 削除するレスポンスヘッダーの名前。 |
戻り値
デフォルトでは true を返します。ヘッダー名が無効な場合は false を返します。
例
add_rsp_header('USER-DEFINED-RSP-1', '1')
add_rsp_header('USER-DEFINED-RSP-1', 'x', true)
add_rsp_header('USER-DEFINED-RSP-2', '2')
del_rsp_header('USER-DEFINED-RSP-2')結果: レスポンスには次のヘッダーが含まれます。
USER-DEFINED-RSP-1: 1
USER-DEFINED-RSP-1: xUSER-DEFINED-RSP-2 は追加された後に削除されるため、レスポンスには含まれません。
get_rsp_header
レスポンスヘッダーの値を取得します。
構文
get_rsp_header(str)パラメーター
パラメーター | タイプ | 必須 | 説明 |
| string | はい | 取得するレスポンスヘッダーの名前。 |
戻り値
ヘッダーが存在する場合: ヘッダーの値を文字列、数値、辞書、またはブール値として返します。
ヘッダーが存在しない場合:
falseを返します。
例
ct = get_rsp_header('content-type')
if ct {
add_rsp_header('origin-content-type', 'is')
} else {
add_rsp_header('origin-content-type', 'no')
}URL リライトとリダイレクト
rewrite
URI を書き換えるか、リクエストをリダイレクトします。
構文
rewrite(url, flag, code)パラメーター
パラメーター | タイプ | 必須 | 説明 |
| string | はい | 書き換えまたはリダイレクト後のターゲット URI または URL。 |
| string | はい | 書き換えモード。以下のフラグのリファレンス表をご参照ください。 |
| numeric | いいえ | リダイレクトの HTTP ステータスコード。 |
フラグのリファレンス
ユースケースに適したフラグを選択するには、この表を参考にしてください。
URI のみ | URI + クエリパラメーター | |
サーバーサイドの書き換え (リダイレクトなし、ブラウザーの URL は変更されません) |
|
|
クライアントサイドリダイレクト (ブラウザーは新しいリクエストを作成し、URL が変更されます) |
|
|
戻り値
書き換え操作 (
break、enhance_break):trueを返します。リダイレクト操作 (
redirect、enhance_redirect): 戻り値はありません。
例
サーバーサイドの書き換え (URI + パラメーター)
if and($arg_mode, eq($arg_mode, 'rewrite:enhance_break')) {
rewrite('/example/examplefile.txt?k=v', 'enhance_break')
}オリジンサーバーは、URI とクエリパラメーターが /example/examplefile.txt?k=v に書き換えられたリクエストを受信します。
クライアントサイドリダイレクト (URI + パラメーター)
if and($arg_mode, eq($arg_mode, 'rewrite:enhance_redirect')) {
rewrite('/example/examplefile.txt?k=v', 'enhance_redirect')
}
if and($arg_mode, eq($arg_mode, 'rewrite:enhance_redirect_301')) {
rewrite('/example/examplefile.txt?k=v', 'enhance_redirect', 301)
}クライアントは、/example/examplefile.txt?k=v への 302 または 301 リダイレクトを受信します。
サーバーサイドの書き換え (URI のみ)
if and($arg_mode, eq($arg_mode, 'rewrite:break')) {
rewrite('/example/examplefile.txt', 'break')
}オリジンサーバーは、URI が /example/examplefile.txt に書き換えられたリクエストを受信します。元のクエリパラメーターは保持されます。
クライアントサイドリダイレクト (URI のみ)
if and($arg_mode, eq($arg_mode, 'rewrite:redirect')) {
rewrite('/example/examplefile.txt', 'redirect')
}
if and($arg_mode, eq($arg_mode, 'rewrite:redirect_301')) {
rewrite('/example/examplefile.txt', 'redirect', 301)
}クライアントは、/example/examplefile.txt への 302 または 301 リダイレクトを受信します。元のクエリパラメーターは保持されます。
レスポンス本文
say
レスポンス本文にコンテンツを出力し、改行文字を追加します。
構文
say(arg)パラメーター
パラメーター | タイプ | 必須 | 説明 |
| any | はい | レスポンス本文に書き込むコンテンツ。 |
戻り値
なし。
例
say('hello')
print('byebye')
print('byebye')出力:
hello
byebyebyebye改行文字を追加せずに、レスポンス本文にコンテンツを出力します。
構文
print(arg)パラメーター
パラメーター | タイプ | 必須 | 説明 |
| any | はい | レスポンス本文に書き込むコンテンツ。 |
戻り値
なし。
例
say('hello')
print('byebye')
print('byebye')出力:
hello
byebyebyebyeexit
指定された HTTP ステータスコードとオプションのレスポンス本文を返し、現在のリクエストを終了します。
構文
exit(code [, body])パラメーター
パラメーター | タイプ | 必須 | 説明 |
| numeric | はい | 返す HTTP ステータスコード。 |
| any | いいえ | レスポンスに含めるレスポンス本文。 |
戻り値
なし。
例
例 1: クエリパラメーターと Cookie に基づくリクエストのブロック
if not($arg_key) {
exit(403)
}リクエストに key クエリパラメーターが含まれていない場合、CDN ノードは HTTP 403 を返します。
if not($cookie_user) {
exit(403, 'not cookie user')
}リクエストに user Cookie が含まれていない場合、CDN ノードは、レスポンス本文に not cookie user を含めて HTTP 403 を返します。
if not(0) {
exit(403)
}not(0) は false と評価されるため、このブロックは実行されません。
if not(false) {
exit(403)
}not(false) は true と評価されるため、CDN ノードは HTTP 403 を返します。
例 2: URI ベースの認証
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-TENGINE-ERROR', 'auth failed - missing necessary uri set')
exit(403)
}
digest = md5(concat(sec1, sec3))
if ne(digest, sec2) {
add_rsp_header('X-TENGINE-ERROR', 'auth failed - invalid digest')
exit(403)
}この例では、リクエスト URI からセグメントを抽出し、MD5 ダイジェストを計算し、埋め込まれた署名と照合します。URI の形式が正しくないか、ダイジェストが一致しない場合、CDN ノードはエラーヘッダーとともに HTTP 403 を返します。
Cookie
add_rsp_cookie
レスポンスに Cookie を設定します。呼び出すたびに、新しい Set-Cookie レスポンスヘッダーが生成されます。
構文
add_rsp_cookie(k, v [, properties])パラメーター
パラメーター | タイプ | 必須 | 説明 |
| string | はい | Cookie の名前。 |
| string | はい | Cookie の値。 |
| dictionary | いいえ |
|
戻り値
Cookie が設定された場合は true を返します。Cookie が設定できなかった場合は false を返します。
例
add_rsp_cookie('user', 'edgescript')
add_rsp_cookie('login_time', tostring(now()), [
'path' = '/'
])
expires = cookie_time(time())
add_rsp_cookie('psid', 'SDF93745HFSDF2934JKHG', [
'path' = '/play',
'domain' = 'foo.com',
'secure' = true,
'httponly' = true,
'expires' = expires,
'max_age' = 100,
'samesite' = 'Strict',
'extension' = 'xxt3s'
])レスポンスには次の Set-Cookie ヘッダーが含まれます。
Set-Cookie: user=edgescript
Set-Cookie: login_time=1582538968.912; Path=/
Set-Cookie: psid=SDF93745HFSDF2934JKHG; Expires=Mon, 24-Feb-20 10:09:28 GMT; Max-Age=100; Domain=foo.com; Path=/play; Secure; HttpOnly; SameSite=Strict; xxt3sエンコーディング
encode_args
辞書のキーと値のペアを、k1=v1&k2=v2 形式の URI エンコードされた文字列に変換します。
構文
encode_args(d)パラメーター
パラメーター | タイプ | 必須 | 説明 |
| dictionary | はい | エンコードする辞書。 |
戻り値
URI エンコードされた文字列を返します。
例
encode_args と decode_args は通常、一緒に使用されます。次の例では、辞書をエンコードしてレスポンスヘッダーとして設定し、それをデコードして個々の値を読み取ります。
my_args = []
set(my_args, 'signature', 'da9dc4b7-87ae-4330-aaaf-e5454e2c2af1')
set(my_args, 'algo', 'private sign1')
my_args_str = encode_args(my_args)
add_rsp_header('X-DSL-ENCODE-ARGS', my_args_str)
to_args = decode_args(my_args_str)
if get(to_args, 'algo') {
add_rsp_header('X-DSL-DECODE-ARGS-ALGO', get(to_args, 'algo'))
}
if get(to_args, 'signature') {
add_rsp_header('X-DSL-DECODE-ARGS-SIGN', get(to_args, 'signature'))
}レスポンスには次のヘッダーが含まれます。
X-DSL-ENCODE-ARGS: signature=da9dc4b7-87ae-4330-aaaf-e5454e2c2af1&algo=private%20sign1
X-DSL-DECODE-ARGS-ALGO: private sign1
X-DSL-DECODE-ARGS-SIGN: da9dc4b7-87ae-4330-aaaf-e5454e2c2af1decode_args
k1=v1&k2=v2 形式の URI エンコードされた文字列を辞書に変換します。
構文
decode_args(s)パラメーター
パラメーター | タイプ | 必須 | 説明 |
| string | はい | デコードする URI エンコードされた文字列。 |
戻り値
文字列から変換された辞書を返します。
例
上記の encode_args の例をご参照ください。 decode_args は逆の操作であり、 encode_args と一緒に使用されます。