全部產品
Search
文件中心

Server Load Balancer:請求處理相關函數

更新時間:Jun 19, 2024

本文為您介紹請求處理相關函數的文法、說明、參數、傳回值和樣本。

add_req_header | del_req_header | add_rsp_header | del_rsp_header | encode_args | decode_args | rewrite | say | print | exit

add_req_header

專案

描述

文法

add_req_header(name, value [, append])

說明

添加要求標頭,即回源要求標頭。

參數

  • name:待添加的要求標頭name,字元類型。

  • value:待添加的要求標頭value,字元類型。

  • append:若要求標頭已添加,append決定是否追加value,預設覆蓋(即預設不追加),布爾類型。

傳回值

預設返回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')

添加2個要求標頭:

USER-DEFINED-REQ-1: 1
USER-DEFINED-REQ-1: x
說明

USER-DEFINED-REQ-2先添加、後刪除,故回應標頭中無USER-DEFINED-REQ-2

del_req_header

專案

描述

文法

del_req_header(name)

說明

刪除要求標頭,即回源要求標頭。

參數

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')

添加2個要求標頭:

USER-DEFINED-REQ-1: 1
USER-DEFINED-REQ-1: x
說明

USER-DEFINED-REQ-2先添加、後刪除,故回應標頭中無USER-DEFINED-REQ-2

add_rsp_header

專案

描述

文法

add_rsp_header(name, value [, append])

說明

添加回應標頭。

參數

  • name:待添加的回應標頭name,字元類型。

  • value:待添加的回應標頭value,字元類型。

    value可包含如下標記,用於在響應階段執行動態替換:

    • ${x}:將替換為變數x的值。

    • @{y}:將替換為回應標頭y的值。

  • append:若回應標頭已添加,append決定是否追加value,預設覆蓋,布爾類型。

傳回值

預設返回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')

輸出2個回應標頭:

USER-DEFINED-RSP-1:1
USER-DEFINED-RSP-1:x
說明

USER-DEFINED-RSP-2先添加、後刪除,故回應標頭中無USER-DEFINED-RSP-2

del_rsp_header

專案

描述

文法

del_rsp_header(name)

說明

刪除回應標頭。

參數

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')

輸出2個回應標頭:

USER-DEFINED-RSP-1:1
USER-DEFINED-RSP-1:x
說明

USER-DEFINED-RSP-2先添加、後刪除,故回應標頭中無USER-DEFINED-RSP-2

encode_args

專案

描述

文法

encode_args(d)

說明

將字典d中的k/v,轉換為URI編碼的k1=v1&k2=v2格式的字串。

參數

d:字典類型。

傳回值

返回URI編碼格式的字串。

樣本

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-AScript-ENCODE-ARGS', my_args_str)

to_args = decode_args(my_args_str)
if get(to_args, 'algo') {
    add_rsp_header('X-AScript-DECODE-ARGS-ALGO', get(to_args, 'algo'))
}
if get(to_args, 'signature') {
    add_rsp_header('X-AScript-DECODE-ARGS-SIGN', get(to_args, 'signature'))
}

輸出3個回應標頭:

X-AScript-ENCODE-ARGS: signature=da9dc4b7-87ae-4330-aaaf-e5454e2c2af1&algo=private%20sign1
X-AScript-DECODE-ARGS-ALGO: private sign1
X-AScript-DECODE-ARGS-SIGN: da9dc4b7-87ae-4330-aaaf-e5454e2c2af1

decode_args

專案

描述

文法

decode_args(s)

說明

將URI編碼的k1=v1&k2=v2格式的字串,轉換為字典類型。

參數

s:目標字串。

傳回值

返迴轉換後的字典對象。

樣本

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-AScript-ENCODE-ARGS', my_args_str)

to_args = decode_args(my_args_str)
if get(to_args, 'algo') {
    add_rsp_header('X-AScript-DECODE-ARGS-ALGO', get(to_args, 'algo'))
}
if get(to_args, 'signature') {
    add_rsp_header('X-AScript-DECODE-ARGS-SIGN', get(to_args, 'signature'))
}

輸出3個回應標頭:

X-AScript-ENCODE-ARGS: signature=da9dc4b7-87ae-4330-aaaf-e5454e2c2af1&algo=private%20sign1
X-AScript-DECODE-ARGS-ALGO: private sign1
X-AScript-DECODE-ARGS-SIGN: da9dc4b7-87ae-4330-aaaf-e5454e2c2af1

rewrite

專案

描述

文法

rewrite(url, flag, code)

說明

改寫操作或重新導向操作。

參數

  • url:目標URL,字串類型。

    • 當flag=redirect或flag=break時,僅改寫URI,則參數URL表示改寫後的目標URI。

    • 當flag=enhance_redirect或flag=enhance_break時,修改整個URI和參數,參數URL表示改寫後的目標URI和參數。

  • flag:重寫入模式,字元類型。

    • redirect :僅修改URI,不修改參數;預設執行302跳轉至URL;如果指定參數code,則響應碼可自訂為:301、302(預設)、303、307或308。

    • break:僅修改URI,不修改參數,將URI修改為URL。

    • enhance_redirect:與redirect類似,但是修改整個URI和參數。

    • enhance_break:與break類似,但是修改整個URI和參數。

  • code:為響應碼,數字類型 。

    當flag=redirect或flag=enhance_redirect時,可自訂響應碼。

傳回值

  • 對於改寫操作,預設返回true

  • 對於重新導向操作,預設不返回。

樣本

if and($arg_mode, eq($arg_mode, 'rewrite:enhance_break')) {
  rewrite('/a/b/c.txt?k=v', 'enhance_break')
}
說明:回源和緩衝的uri+參數,修改為/a/b/c.txt?k=v

if and($arg_mode, eq($arg_mode, 'rewrite:enhance_redirect')) {
  rewrite('/a/b/c.txt?k=v', 'enhance_redirect')
}
if and($arg_mode, eq($arg_mode, 'rewrite:enhance_redirect_301')) {
  rewrite('/a/b/c.txt?k=v', 'enhance_redirect', 301)
}
說明:302或301跳轉至/a/b/c.txt?k=v

if and($arg_mode, eq($arg_mode, 'rewrite:break')) {
  rewrite('/a/b/c.txt', 'break')
}
說明:回源和緩衝的uri,修改為/a/b/c.txt,保持原參數不變

if and($arg_mode, eq($arg_mode, 'rewrite:redirect')) {
  rewrite('/a/b/c.txt', 'redirect')
}
if and($arg_mode, eq($arg_mode, 'rewrite:redirect_301')) {
  rewrite('/a/b/c.txt', 'redirect', 301)
}
說明:302或301跳轉至/a/b/c.txt,保持原參數不變

say

專案

描述

文法

say(arg)

說明

輸出響應體,並在行尾追加分行符號。

參數

arg:任意類型。

傳回值

無。

樣本

say('hello')
print('byebye')
print('byebye')

輸出:

hello
byebyebyebye

print

專案

描述

文法

print(arg)

說明

輸出響應體與say()相同,但不會在行尾追加分行符號。

參數

arg:任意類型。

傳回值

無。

樣本

say('hello')
print('byebye')
print('byebye')

輸出:

hello
byebyebyebye

exit

專案

描述

文法

exit(code [, body])

說明

以狀態代碼code結束當前請求。若有body,則為響應體。

參數

  • code:響應狀態代碼。

  • body:響應體。

傳回值

無。

樣本

  • 樣本1

    if not($arg_key) {
        exit(403)
    }
    說明:如果請求未攜帶參數key時,403拒絕請求。
    
    if not($cookie_user) {
        exit(403, 'not cookie user')
    }
    說明:當請求未攜帶cookie user時,403拒絕請求,響應body為'not cookie user'
    
    if not(0) {
        exit(403)
    }
    說明:not(0)的結果為false
    
    if not(false) {
        exit(403)
    }
    說明:not(false)的結果為true
  • 樣本2

    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)
    }