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])パラメーター
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
name | 文字列 | はい | 追加するリクエストヘッダーの名前です。 |
value | 文字列 | はい | 追加するリクエストヘッダーの値です。 |
append | ブール値 | いいえ | 同じ名前のヘッダーがすでに存在する場合に、新しいヘッダーを追加するかどうかを指定します。デフォルトは false です。false の場合、新しい値で既存の値を上書きします。 |
戻り値
デフォルトで 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)パラメーター
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
name | 文字列 | はい | 削除するリクエストヘッダーの名前です。 |
戻り値
デフォルトで 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])パラメーター
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
name | 文字列 | はい | 追加するレスポンスヘッダーの名前です。 |
value | 文字列 | はい | 追加するレスポンスヘッダーの値です。動的式をサポートしています:${x} は ngx.var.x の値に置き換えられ、@{y} はレスポンスヘッダー y の値に置き換えられます。 |
append | ブール値 | いいえ | 同じ名前のヘッダーがすでに存在する場合に、新しいヘッダーを追加するかどうかを指定します。デフォルトは false です。false の場合、新しい値で既存の値を上書きします。 |
戻り値
デフォルトで 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)パラメーター
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
name | 文字列 | はい | 削除するレスポンスヘッダーの名前です。 |
戻り値
デフォルトで 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)パラメーター
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
str | 文字列 | はい | 取得するレスポンスヘッダーの名前です。 |
戻り値
ヘッダーが存在する場合:文字列、数値、辞書、またはブール値としてヘッダーの値を返します。
ヘッダーが存在しない場合:
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)パラメーター
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
url | 文字列 | はい | 書き換えまたはリダイレクト後のターゲット URI または URL です。 |
flag | 文字列 | はい | リライトモードです。以下のフラグリファレンステーブルをご参照ください。 |
code | 数値 | いいえ | リダイレクト時の HTTP ステータスコードです。flag が redirect または enhance_redirect の場合にのみ適用されます。有効な値:301、302、303、307、308。デフォルト:302。 |
フラグリファレンス
ユースケースに応じて適切なフラグを選択してください。
| URI のみ | URI + クエリパラメーター | |
|---|---|---|
| サーバーサイドでのリライト(リダイレクトなし、ブラウザの URL は変更されない) | break | enhance_break |
| クライアントサイドでのリダイレクト(ブラウザが新しいリクエストを送信し、URL が変更される) | redirect | enhance_redirect |
戻り値
リライト操作(
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)パラメーター
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
arg | 任意 | はい | レスポンスボディに書き込むコンテンツです。 |
戻り値
なし。
使用例
say('hello')
print('byebye')
print('byebye')出力:
hello
byebyebyebyeレスポンスボディにコンテンツを出力しますが、改行文字は追加しません。
構文
print(arg)パラメーター
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
arg | 任意 | はい | レスポンスボディに書き込むコンテンツです。 |
戻り値
なし。
使用例
say('hello')
print('byebye')
print('byebye')出力:
hello
byebyebyebyeexit
指定された HTTP ステータスコードとオプションのレスポンスボディを使用して、現在のリクエストを終了します。
構文
exit(code [, body])パラメーター
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
code | 数値 | はい | 返す HTTP ステータスコードです。 |
body | 任意 | いいえ | レスポンスに含めるボディです。 |
戻り値
なし。
使用例
例 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])パラメーター
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
k | 文字列 | はい | Cookie の名前です。 |
v | 文字列 | はい | Cookie の値です。 |
properties | 辞書 | いいえ | Cookie 属性(例: path、domain、secure、httponly、expires、max_age、samesite、および extension)。属性の完全なリファレンスについては、「Set-Cookie」をご参照ください。 |
戻り値
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)パラメーター
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
d | 辞書 | はい | エンコードする辞書です。 |
戻り値
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)パラメーター
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
s | 文字列 | はい | デコードする URI エンコード済み文字列です。 |
戻り値
文字列から変換された辞書を返します。
使用例
上記の encode_args の使用例をご参照ください。decode_args は逆の操作であり、encode_args と組み合わせて使用されます。