EdgeScript menyediakan fungsi bawaan untuk memanipulasi header permintaan dan respons HTTP, menulis ulang atau mengalihkan URI, menghasilkan badan respons, serta mengatur cookie. Referensi ini mencakup sintaksis, parameter, nilai kembali, dan contoh setiap fungsi.
Lompat ke:
Header permintaan:
add_req_header,del_req_headerHeader respons:
add_rsp_header,del_rsp_header,get_rsp_headerPenulisan ulang URL dan pengalihan:
rewriteBadan respons:
say,print,exitCookie:
add_rsp_cookieEncoding:
encode_args,decode_args
Header permintaan
add_req_header
Menambahkan header permintaan sebelum permintaan diteruskan ke origin server.
Sintaksis
add_req_header(name, value [, append])Parameter
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
name | string | Ya | Nama header permintaan yang akan ditambahkan. |
value | string | Ya | Nilai header permintaan yang akan ditambahkan. |
append | Boolean | Tidak | Apakah akan menambahkan header jika header dengan nama yang sama sudah ada. Default: false. Jika false, nilai baru akan menimpa nilai yang sudah ada. |
Nilai kembali
Mengembalikan true secara default. Mengembalikan false jika nama header tidak valid.
Contoh
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')Hasil: origin server menerima header berikut:
USER-DEFINED-REQ-1: 1
USER-DEFINED-REQ-1: xUSER-DEFINED-REQ-2 ditambahkan lalu dihapus, sehingga tidak diteruskan ke origin server.
del_req_header
Menghapus header permintaan sebelum permintaan diteruskan ke origin server.
Sintaksis
del_req_header(name)Parameter
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
name | string | Ya | Nama header permintaan yang akan dihapus. |
Nilai kembali
Mengembalikan true secara default. Mengembalikan false jika nama header tidak valid.
Contoh
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')Hasil: origin server menerima header berikut:
USER-DEFINED-REQ-1: 1
USER-DEFINED-REQ-1: xUSER-DEFINED-REQ-2 ditambahkan lalu dihapus, sehingga tidak diteruskan ke origin server.
Header respons
add_rsp_header
Menambahkan header respons.
Sintaksis
add_rsp_header(name, value [, append])Parameter
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
name | string | Ya | Nama header respons yang akan ditambahkan. |
value | string | Ya | Nilai header respons yang akan ditambahkan. Mendukung ekspresi dinamis: ${x} diganti dengan nilai ngx.var.x; @{y} diganti dengan nilai header respons y. |
append | Boolean | Tidak | Apakah akan menambahkan header jika header dengan nama yang sama sudah ada. Default: false. Jika false, nilai baru akan menimpa nilai yang sudah ada. |
Nilai kembali
Mengembalikan true secara default. Mengembalikan false jika nama header tidak valid.
Contoh
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')Hasil: respons mencakup header berikut:
USER-DEFINED-RSP-1: 1
USER-DEFINED-RSP-1: xUSER-DEFINED-RSP-2 ditambahkan lalu dihapus, sehingga tidak termasuk dalam respons.
del_rsp_header
Menghapus header respons.
Sintaksis
del_rsp_header(name)Parameter
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
name | string | Ya | Nama header respons yang akan dihapus. |
Nilai kembali
Mengembalikan true secara default. Mengembalikan false jika nama header tidak valid.
Contoh
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')Hasil: respons mencakup header berikut:
USER-DEFINED-RSP-1: 1
USER-DEFINED-RSP-1: xUSER-DEFINED-RSP-2 ditambahkan lalu dihapus, sehingga tidak termasuk dalam respons.
get_rsp_header
Mengambil nilai header respons.
Sintaksis
get_rsp_header(str)Parameter
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
str | string | Ya | Nama header respons yang akan diambil. |
Nilai kembali
Jika header ada: mengembalikan nilai header sebagai string, angka, dictionary, atau Boolean.
Jika header tidak ada: mengembalikan
false.
Contoh
ct = get_rsp_header('content-type')
if ct {
add_rsp_header('origin-content-type', 'is')
} else {
add_rsp_header('origin-content-type', 'no')
}Penulisan ulang URL dan pengalihan
rewrite
Menulis ulang URI atau mengalihkan permintaan.
Sintaksis
rewrite(url, flag, code)Parameter
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
url | string | Ya | URI atau URL target setelah penulisan ulang atau pengalihan. |
flag | string | Ya | Mode penulisan ulang. Lihat tabel referensi flag di bawah. |
code | numeric | Tidak | Kode status HTTP untuk pengalihan. Hanya berlaku ketika flag bernilai redirect atau enhance_redirect. Nilai yang valid: 301, 302, 303, 307, 308. Default: 302. |
Referensi flag
Gunakan tabel ini untuk memilih flag yang tepat sesuai kebutuhan Anda:
| Hanya URI | URI + parameter kueri | |
|---|---|---|
| Penulisan ulang sisi server (tanpa pengalihan, URL di browser tidak berubah) | break | enhance_break |
| Pengalihan sisi klien (browser membuat permintaan baru, URL berubah) | redirect | enhance_redirect |
Nilai kembali
Operasi penulisan ulang (
break,enhance_break): mengembalikantrue.Operasi pengalihan (
redirect,enhance_redirect): tidak mengembalikan nilai.
Contoh
Penulisan ulang sisi server (URI + parameter)
if and($arg_mode, eq($arg_mode, 'rewrite:enhance_break')) {
rewrite('/example/examplefile.txt?k=v', 'enhance_break')
}Origin server menerima permintaan dengan URI dan parameter kueri yang ditulis ulang menjadi /example/examplefile.txt?k=v.
Pengalihan sisi klien (URI + parameter)
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)
}Klien menerima pengalihan 302 atau 301 ke /example/examplefile.txt?k=v.
Penulisan ulang sisi server (hanya URI)
if and($arg_mode, eq($arg_mode, 'rewrite:break')) {
rewrite('/example/examplefile.txt', 'break')
}Origin server menerima permintaan dengan URI yang ditulis ulang menjadi /example/examplefile.txt. Parameter kueri asli tetap dipertahankan.
Pengalihan sisi klien (hanya 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)
}Klien menerima pengalihan 302 atau 301 ke /example/examplefile.txt. Parameter kueri asli tetap dipertahankan.
Badan respons
say
Mencetak konten ke badan respons dan menambahkan karakter baris baru.
Sintaksis
say(arg)Parameter
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
arg | apa saja | Ya | Konten yang akan ditulis ke badan respons. |
Nilai kembali
Tidak ada.
Contoh
say('hello')
print('byebye')
print('byebye')Output:
hello
byebyebyebyeMencetak konten ke badan respons tanpa menambahkan karakter baris baru.
Sintaksis
print(arg)Parameter
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
arg | apa saja | Ya | Konten yang akan ditulis ke badan respons. |
Nilai kembali
Tidak ada.
Contoh
say('hello')
print('byebye')
print('byebye')Output:
hello
byebyebyebyeexit
Menghentikan permintaan saat ini dengan kode status HTTP yang ditentukan dan badan respons opsional.
Sintaksis
exit(code [, body])Parameter
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
code | numeric | Ya | Kode status HTTP yang akan dikembalikan. |
body | apa saja | Tidak | Badan respons yang akan disertakan dalam respons. |
Nilai kembali
Tidak ada.
Contoh
Contoh 1: memblokir permintaan berdasarkan parameter kueri dan cookie
if not($arg_key) {
exit(403)
}Jika permintaan tidak menyertakan parameter kueri key, node CDN mengembalikan HTTP 403.
if not($cookie_user) {
exit(403, 'not cookie user')
}Jika permintaan tidak menyertakan cookie user, node CDN mengembalikan HTTP 403 dengan badan respons not cookie user.
if not(0) {
exit(403)
}not(0) dievaluasi sebagai false, sehingga blok ini tidak dijalankan.
if not(false) {
exit(403)
}not(false) dievaluasi sebagai true, sehingga node CDN mengembalikan HTTP 403.
Contoh 2: otentikasi berbasis 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)
}Contoh ini mengekstraksi segmen dari URI permintaan, menghitung digest MD5, dan memvalidasinya terhadap signature yang tertanam. Jika URI tidak sesuai format atau digest tidak cocok, node CDN mengembalikan HTTP 403 dengan header error.
Cookie
add_rsp_cookie
Mengatur cookie dalam respons. Setiap pemanggilan menghasilkan header respons Set-Cookie baru.
Sintaksis
add_rsp_cookie(k, v [, properties])Parameter
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
k | string | Ya | Nama cookie. |
v | string | Ya | Nilai cookie. |
properties | dictionary | Tidak | Atribut cookie seperti path, domain, secure, httponly, expires, max_age, samesite, dan extension. Untuk referensi atribut lengkap, lihat Set-Cookie. |
Nilai kembali
Mengembalikan true jika cookie berhasil diatur. Mengembalikan false jika cookie tidak dapat diatur.
Contoh
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'
])Respons mencakup header Set-Cookie berikut:
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; xxt3sEncoding
encode_args
Mengonversi pasangan kunci-nilai dalam dictionary menjadi string yang di-encode URI dalam format k1=v1&k2=v2.
Sintaksis
encode_args(d)Parameter
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
d | dictionary | Ya | Dictionary yang akan di-encode. |
Nilai kembali
Mengembalikan string yang di-encode URI.
Contoh
encode_args dan decode_args biasanya digunakan bersama. Contoh berikut meng-encode dictionary, mengaturnya sebagai header respons, lalu mendekode dan membaca nilai individualnya:
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'))
}Respons mencakup header berikut:
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
Mengonversi string yang di-encode URI dalam format k1=v1&k2=v2 menjadi dictionary.
Sintaksis
decode_args(s)Parameter
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
s | string | Ya | String yang di-encode URI yang akan didekode. |
Nilai kembali
Mengembalikan dictionary yang dikonversi dari string tersebut.
Contoh
Lihat contoh encode_args di atas. decode_args merupakan operasi invers dan digunakan bersama dengan encode_args.