DataScript 可用于检查客户端 HTTP 请求或服务器 HTTP 响应,并执行内容切换、重定向、标头操作、日志记录等。下表列出了 NSX Advanced Load Balancer 上可用的 HTTP DataScript。

字符串

描述

DataScript: avi.http.add_cookie( table )

插入新 Cookie。

DataScript: avi.http.add_header( name, value )

插入新的标头和值。

avi.http.close_conn( [reset] )

关闭或重置 TCP 连接。

DataScript: avi.http.cookie_exists( name, [context] )

验证 Cookie 是否已存在。

DataScript: avi.http.disable()

升级(禁用)当前连接的 HTTP 处理,该操作随后将被视为 L4 TCP。

avi.http.get_cookie( name [, context] )

返回 Cookie 的值。

avi.http.get_cookie_names ( [context] )

返回 Cookie 的名称。

avi.http.get_header( [[name] [context]] )

返回标头名称或其值。

avi.http.get_host_tokens( [start [, end]] )

返回主机的子部分。

avi.http.get_path( [false] )

返回 URI 的路径 /path.index.htm

avi.http.get_path_tokens( [start [, end]] )

返回路径的子部分。

avi.http.get_query( [arg_name | avi.QUERY_TABLE] [, decode] )

返回 URI 的查询?a=1&b=2

avi.http.get_req_body([size_in_kb])

返回客户端请求正文的部分或整个内容。

avi.http.get_request_id()

返回请求 ID。

avi.http.get_reqvar()

通过 avi.http.set() 函数获取(读取)存储在变量中的数据。

avi.http.get_response_body(size [, offset])

从缓冲响应正文中的指定千字节偏移开始获取(读取)指定的千字节数。

avi.http.get_uri( [false] )

返回 URI(路径加查询)。

avi.http.get_userid( )

返回会话的用户 ID。

avi.http.hostname( )

返回客户端请求的主机名。

avi.http.internal_status()

以字符串形式返回 HTTP 状态。

avi.http.method( )

返回客户端的请求方法。

avi.http.protocol( )

返回会话协议 http 或 https。

avi.http.oauth_get_token(TOKEN_TYPE)

从用户的 OAuth 会话中提取 TOKEN_TYPE 令牌。

avi.http.redirect( uri [,status] )

重定向请求。

avi.http.remove_cookie( name1, [name2, ...] )

移除现有 Cookie。

avi.http.remove_header( name )

移除标头的所有实例。

avi.http.replace_cookie( table )

替换现有 Cookie 的值。

avi.http.replace_header( name, value )

替换现有标头的值。

avi.http.response( status, [headers, [body]] )

发送定义的 HTTP 响应页面。

avi.http.saml_session_decrypt( )

返回已解密 SAML 会话 Cookie(如果存在)的字符串;否则返回 nil。

avi.http.scheme( )

返回 http://https://

avi.http.secure( )

返回 on(对于 https)或 nil(对于 http.

avi.http.set_path( new_uri )

修改请求的路径。

avi.http.set_query( integer | string | table )

修改请求的查询。

avi.http.set_reqvar()

将 HTTP 请求事件中的任意数据设置(写入)到变量中。这些变量的范围涵盖 HTTP_REQHTTP_RESP 事件。

avi.http.set_response_body_buffer_size(size)

设置要缓冲的最大响应正文。

avi.http.set_server_timeout( time )

为特定请求设置自定义超时值。

avi.http.set_uri( new_uri )

更改 URI。

avi.http.set_userid( )

设置会话的用户 ID。

avi.http.status( )

返回要发送到客户端的状态代码。

avi.http.update_cookie()

修改 HTTP 响应中的现有 Cookie 属性值。

avi.http.disable_auth()

禁用客户端身份验证。

avi.http.add_cookie

函数

avi.http.add_cookie( table )

描述

在 HTTP 请求或响应中插入一个或多个新的 Cookie。如果 Cookie 已存在,VMware NSX Advanced Load Balancer 会将指定的值或标记附加到现有 Cookie。

事件

HTTP_REQ

HTTP_RESP

参数

HTTP 请求上下文的 Cookie 名称值对及 HTTP 响应的可选附加 Cookie 属性值对(如路径、域等)表。

请求参数

HTTP 请求事件:将 Cookie 名称值对添加到 HTTP 请求的 Cookie 标头中,如果不存在此类标头,则会添加 Cookie 标头。

avi.http.add_cookie( name1, value1 [, name2, value2] )

name 是新 Cookie 的名称。

value 是新 Cookie 的值或数据字段。

在 HTTP 请求上下文中,所有参数都被视为 Cookie 名称值对,即函数将忽略 Cookie 属性,如“Domain”、“Path”等,并将它们视为要添加的另一个 Cookie。

响应参数

HTTP 响应事件:在 HTTP 响应上下文中调用时,会将 Cookie 名称值对添加 HTTP 响应的 Set-Cookie 标头中。如果此类标头不存在,则会创建 Set-Cookie 标头。

在 HTTP 响应上下文中,仅将前两个参数视为 Cookie 名称值对,后续参数将被视为 Cookie 属性,如 DomainPath 等及其相应的值。

avi.http.add_cookie( name, value, path, domain, expires, maxage, httponly, secure )

name 是新 Cookie 的名称。

value 是新 Cookie 的值或数据字段。

path 是 path 属性的值(字符串)。

domain 是 domain 属性的值(字符串)。

expires 是 expires 属性的值(整数)。

maxage 是 maxage 属性的值(整数)。

httponly 是 httponly 属性的值(布尔值)。

secure 是 secure 属性的值(布尔值)。

返回

无。

HTTP 请求示例

示例方法 1:添加两个 Cookie:jsessionid=123 和 lang=en

cookie_table = {jsessionid="123", lang="en"}avi.http.add_cookie( cookie_table )

示例方法 2:添加两个 Cookie:jsessionid=123 和 lang=en

avi.http.add_cookie( "jsessionid", "123", "lang", "en" )

HTTP 响应示例

示例 1:添加 jsessionid 值为 123 并且具有属性 path=/ 和 domain=www.avinetworks.com 的 Cookie,以在 HTTP 响应中生成以下标头:

Set-Cookie: jsessionid=123; path=/;domain=www.avinetworks.com

cookie_table = {jsessionid="123", path="/", domain="www.avinetworks.com"}
avi.http.add_cookie( cookie_table )

示例 2:在此格式中,顺序很重要。第三、第四、第五、第六、第七和第八个参数必须分别是 pathdomainexpiresmaxagehttponly flagsecure flag

avi.http.add_cookie( "jsessionid", "123", "/", "www.avinetworks.com" )

如果不需要 expiresmaxage 属性,那么会将值 0 作为参数传递。

avi.http.add_cookie( "jsessionid", "123", "/", "a.b.c", 0, 0, true, true)

avi.http.add_header

函数

avi.http.add_header( name, value )

描述

将具有指定名称和值的标头添加到客户端 HTTP 请求标头或服务器 HTTP 响应标头中。

如果已存在具有相同名称的标头,则会将具有该名称的新标头附加到现有标头列表的末尾。

事件

HTTP_REQ

HTTP_RESP

LB_DONE

参数

name 是指定新标头名称的字符串。

value 是指定新标头值的字符串。

返回

无返回值。

示例

如果用户代理包含 Mozilla,请在 HTTP 请求中添加一个名为 X-Foo 且值为 Bar 的标头。

ua = avi.http.get_header("user-agent")
i,j = string.find(ua, "Mozilla")
if i then
   avi.http.add_header("X-Foo", "Bar")
end

avi.http.close_conn

函数

avi.http.close_conn( [reset] )

描述

关闭当前的 TCP 连接。

事件

HTTP_REQ

HTTP_RESP

参数

reset 标记将对连接进行 RST,而不是使用默认的 FIN

返回

无返回值。

示例

if avi.vs.client_ip() == "10.1.1.1" then
   avi.http.close_conn()
end

avi.http.cookie_exists

函数

avi.http.cookie_exists( name, [context] )

描述

如果 HTTP 请求或响应中存在 Cookie 名称,则返回 true。context 用于确定请求或响应。如果未指定 context,则默认 context 将基于执行 DataScript 的事件。

事件

HTTP_REQ

HTTP_REQ_BODY

HTTP_RESP

参数

name:它是指定 Cookie 名称的字符串。

context:指定 avi.HTTP_REQUESTavi.HTTP_RESPONSE 的上下文以从这些事件检查 Cookie,而不是从当前事件上下文检查 Cookie。

例如,在 HTTP 响应事件期间,检查客户端在请求事件期间发送的 Cookie。

注:

如果在 HTTP_REQHTTP_REQ_BODY 事件中调用函数,则无法将 avi.HTTP_RESPONSE 作为上下文参数提供给 get_cookie

返回

如果 Cookie 名称存在,则返回布尔值 true,否则返回布尔值 false

示例

如果 ServerIP Cookie 存在,请将请求发送到该 Cookie 中定义的服务器 IP 地址。

if avi.http.cookie_exists("ServerIP") then
   avi.pool.select("Pool1", avi.http.get_cookie("ServerIP"))
end

avi.http.disable()

函数

avi.http.disable()

描述

WebSocket 等协议可以嵌入到 HTTP 中。初始连接和握手以 HTTP 开始,然后切换到非 HTTP、非 HTML 协议。某些 Microsoft 应用程序、Java 和二进制协议使用此方法通过 HTTP 进行隧道传输。

借助 avi.http.disable() 函数,DataScript 可以通过 HTTP 监控客户端到服务器的握手,并在协议切换到非 HTTP 时禁用 HTTP 进程。

请注意,可以通过 HTTP 配置文件本机启用 Websocket 支持。某些应用程序协议使用的标头名称会略有不同,此时需要 DataScript。

可以在 HTTP 响应事件期间调用 avi.http.disable() 函数。服务引擎将服务器的响应发送到客户端,并升级(禁用)当前连接的 HTTP 处理,随后将被视为 L4 TCP。如果正在执行 SSL 终止,那么此过程将继续而不会中断。无法为连接再次启用 HTTP 处理。

事件

HTTP_RESP

参数

返回

示例

HTTP 请求事件

if string.lower(avi.http.get_header("Upgrade")) == "websocket" and string.lower(avi.http.get_header("Connection") == "upgrade" then
   avi.http.set_reqvar("var", 1)
end

HTTP 响应事件

if avi.http.get_reqvar("var") == 1 then
   avi.http.disable()
end

avi.http.get_cookie( name [, context] )

函数

avi.http.get_cookie( name [, context] )

描述

从客户端请求或服务器响应标头返回特定 Cookie 的值。

事件

HTTP_REQ

HTTP_REQ_BODY

HTTP_RESP

参数

Name:要检查的 Cookie 的名称。

Context:指定 avi.HTTP_REQUESTavi.HTTP_RESPONSE 的上下文以从这些事件检查 Cookie,而不是从当前事件上下文检查 Cookie。

例如,在 HTTP response 事件期间,检查客户端在请求事件期间发送的 Cookie。

注:

如果在 HTTP_REQHTTP_REQ_BODY 事件中调用函数,则无法将 avi.HTTP_RESPONSE 作为上下文参数提供给 get_cookie

返回值

如果提供了 name:

  • 则返回 Cookie 值的字符串(如果存在),否则返回 nil

  • (仅在 HTTP_RESP 中并且未提供 avi.HTTP_REQUEST 作为上下文参数时):在响应中显示的 Set-Cookie 标头中提供的属性表。Key:属性名称,Value:属性值

If

Set-Cookie: A1=foobar; path=/path/to/file/; Domain=avinetworks.com; secure; HTTPOnly

则表为:

{path = '/path/to/file/', Domain = 'avinetworks.com', secure = true, HTTPOnly = true}

如果未提供 name:

  • 请求或响应标头中提供的所有 Cookie 的表。Key:Cookie 名称,Value:Cookie 值

    • 示例

{name1 = 'value1', name2 = 'value2', name3 = 'value3'}

示例

检查名为 foo 的 Cookie 的值。如果该值不是 bar,请执行一些操作。

if avi.http.get_cookie("foo") ~= "bar" then
   -- do something with the cookie header
end

其他示例

示例 1:HTTP_RESP 事件中的 get_cookie,并显示属性表。

value, attr_tbl = avi.vs.get_cookie("A1")

local k, v = next(attr_tbl, nil) 
output = ""
while k do 
	if type(v) ~= "boolean" then 
		output = output .. ", " .. k .. ": " .. v 
	else 
		output = output .. ", " .. k .. ": " .. tostring(v) 
	end 
	k, v = next(attr_tbl, k) 
end 
if v then 
	output = output .. ", " .. k .. ": " .. v 
end

avi.vs.log("value= " .. value .. "; attributes= " .. output)

如果响应具有标头 Set-Cookie: A1=foobar; path=/path/to/file/; Domain=avinetworks.com; secure; HTTPOnly,则 DataScript 日志将为 "value= foobar; attributes= , path: /path/to/file/, Domain: avinetworks.com, secure: true, HTTPOnly: true"

示例 2:不带 name 参数的 get_cookie

cookies = avi.vs.get_cookie()

local k, v = next(cookies, nil) 
output = ""
while k do 
	output = output .. ", " .. k .. "=" .. v 
	k, v = next(attr_tbl, k) 
end

if v then 
	output = output .. ", " .. k .. "=" .. v 
end

avi.vs.log("cookies: " .. output)

DataScript 日志的格式为:"cookies: , name1=value1, name2=value=2, name3=value3, ..."

avi.http.get_cookie_names ( [context] )

函数

avi.http.get_cookie_names ( [context] )

描述

返回 HTTP 请求或响应中存在的所有 Cookie,由 context 标记确定。如果未指定 context,则会根据执行 DataScript 的事件进行选择。

事件

HTTP_REQ

HTTP_REQ_BODY

HTTP_RESP

参数

Context:指定 avi.HTTP_REQUESTavi.HTTP_RESPONSE 的上下文以从这些事件检查 Cookie,而不是从当前事件上下文检查 Cookie。

例如,在 HTTP 响应事件期间,通过传递 avi.HTTP_REQUEST 来检查客户端在请求事件期间发送的 Cookie。

返回

一个表,其中包含 Cookie 名称和用于指示所存在 Cookie 数量的数字。

示例

cookies, count = avi.http.get_cookie_names()
if count == 0 then
   -- No cookies found, do something
end

avi.http.get_header( [[name] [context]] )

函数

avi.http.get_header( [[name] [context]] )

描述

返回一个表,其中包含所有标头及其值,作为表中的键值对。

默认情况下,在 HTTP_REQ 事件内执行时,将对 HTTP_RESP 事件的服务器响应标头和客户端请求标头执行命令。

事件

HTTP_REQ

HTTP_RESP

LB_DONE

参数

如果未指定 name,将返回包含所有标头和相应值的键表。当明确重复标头时(例如,如果有多个 Set-Cookie 标头),表将包含标头的单个键,且值为表数组。

如果指定了 name,则将作为字符串仅返回指定标头的值。如果指定的标头重复,则只会返回第一个标头值。

context 标记允许从 avi.HTTP_REQUESTavi.HTTP_RESPONSE 事件检查标头值。例如,在 HTTP_RESP 事件期间,可以检查客户端请求标头。

返回

一个表,其中包含标头及其值或特定标头值的字符串。

示例

以下示例可用于防止 Shell Shock 攻击。此攻击会嵌入以 () 字符开头的客户端标头。

headers = avi.http.get_header()                -- get all the HTTP headers
for key,val in pairs(headers) do               -- iterate through all headers
   if #val > 2 and string.sub(val, 1, 2) == "()" then
      avi.http.close_conn()                    -- reset the TCP connection
   end
end

avi.http.get_host_tokens( [start [, end]] )

函数

avi.http.get_host_tokens("MODIFIED" [,start [, end]]) 或 avi.http.get_host_tokens( [start [, end]] )

描述

  • avi.http.get_host_tokens("MODIFIED")avi.http.get_host_tokens("MODIFIED", start)avi.http.get_host_tokens("MODIFIED", start, end):返回更新的主机标头令牌。例如,当主机标头被 HTTP 策略的重写 URL 操作覆盖时。

  • avi.http.get_host_tokens( [start [, end]] ):如果调用时不带任何参数,则从主机名中检索各个主机部分或令牌(以分隔符“.”分隔的字符串)。借助此命令,可在提供起始或结束索引时,灵活地获取部分主机令牌(请参阅以下示例)。

事件

HTTP_REQ

HTTP_RESP

参数

startend 索引,允许解析出主机标头部分。

返回

如果未指定 startend 索引,将返回包含所有主机令牌的表。

如果指定了 start 索引或同时指定了 startend 索引,将返回一个字符串。

示例

主机标头示例:http://www.avinetworks.com/a/b/index.htm?avi=true

如果我们的 HTTP 请求策略,并将重定向操作设置为 www.vmware.com

avi.http.get_host_tokens("MODIFIED", 1)

返回“www.vmware.com”

avi.http.get_host_tokens(1)

返回“www.avinetworks.com”

avi.http.get_host_tokens("MODIFIED",2,2)

返回“vmware”

avi.http.get_host_tokens(2,2)

返回“avinetworks”

avi.http.get_host_tokens(6)

返回“nil”

avi.http.get_host_tokens("MODIFIED", 6)

返回“nil”

domain = avi.http.get_host_tokens(2, 3)
if domain ~= "avinetworks.com" then    avi.http.redirect("new.avinetworks.com") end
注:

事件 SSL_PRECONNECTSSL_CLIENTHELLOSSL_HANDSHAKE_DONE 不支持此 API。

avi.http.get_path( [false] )

函数

avi.http.get_path( [false] )

描述

返回客户端请求的已解析 URI 路径,即不包含查询的 URI 部分,以第一个“/”开头,一直到“?”但不包括“?”。

请求的突出显示部分包含在路径中:http://www.avinetworks.com/path1/path2/index.html?a=b&c=d

事件

HTTP_REQ

HTTP_RESP

参数

当可选标记设置为 false 时,将取消解析返回的 URI 路径,即不是解码的 URI。

返回

URI 路径的字符串值

示例

对于 IIS 商店,丢弃搜索 PHP 后门的机器人程序

if string.endswith(avi.http.get_path(), ".php") then  
  avi.http.close_conn(true) 
end

avi.http.get_path_tokens( [start [, end]] )

函数

avi.http.get_path_tokens( [start [, end]] )

描述

从 URI 的路径(以分隔符“/”分隔的字符串)中检索各个路径部分或令牌。借助此命令,可在提供起始或结束索引时,灵活地获取部分路径令牌(请参阅以下示例)。

事件

HTTP_REQ

HTTP_RESP

参数

startend 索引允许解析出路径部分。这些参数以整数表示。

返回

如果未指定 startend 索引,将返回包含所有路径令牌的 Lua 表。如果指定了 start 索引或同时指定了 startend 索引,将返回一个字符串。

示例

示例:https://www.avinetworks.com/a/b/c/d/e.htm

返回一个表,该表是包含值“a”、“b”、“c”、“d”、“e.htm”的数组。将返回所有令牌。

avi.http.get_path_tokens()

返回“a/b/c/d/e.htm”

avi.http.get_path_tokens(1)

返回“c/d/e.htm”

avi.http.get_path_tokens(3)

返回“b/c”

avi.http.get_path_tokens(2,3)

返回“nil”

avi.http.get_path_tokens(7)
注:

事件 SSL_PRECONNECTSSL_CLIENTHELLOSSL_HANDSHAKE_DONE 不支持此 API。

avi.http.get_query( [arg_name | avi.QUERY_TABLE] [, decode] )

函数

avi.http.get_query( [arg_name | avi.QUERY_TABLE] [, decode] )

描述

返回 URI 中的查询或单个查询值。请求的突出显示部分包含在查询中:http://www.avinetworks.com/path1/path2/index.html?a=b&c=d

在此示例中,a=ba 是参数,b 是值。

事件

HTTP_REQ

HTTP_RESP

参数

如果未指定任何参数,则会返回完整查询。如果指定了 arg_name,并且查询中存在该参数,则会返回其值。

如果指定了标记 avi.QUERY_TABLE,将返回包含所有参数的表。

  • 此表中的参数始终是解码的 URI。

  • 如果某个参数在查询中多次出现,则相应的键值将是包含键值的表。

  • 如果参数键没有值,则返回的值为布尔值 true。

  • 如果为参数提供了空值 (/index.htm?a=&c=d),则键将具有空值。

默认情况下,将作为已解码的 URI 返回查询。例如,‘/’ 而非 %2Fdecode 参数将对返回的值进行 URI 解码。

decode 参数的默认值为 true。如果为 decode 参数提供 false,查询将返回未解码的 URI。

注:

如果提供的格式为 avi.QUERY_TABLE,则 decode 参数不起作用。

返回

返回的查询的字符串,单个参数和值,或包含所有参数和值的表(其中参数名称为键)。

示例 1

if avi.http.get_query("intro", false) == "hello%20world" then    avi.http.add_header("intro", false) end

示例 2

通过本地响应页面将所有 URI 查询参数返回到客户端。

local qa = avi.http.get_query(avi.QUERY_TABLE)
local resp = ""
for k, v in pairs(qa) do
   if type(v) == table then
      resp = resp .. k .. ":" .. table.concat(v, ",") .. ", "
   else
      resp = resp .. k .. ":" .. tostring(v) .. ", "
      -- when v is bool tostring() converts to string
   end
end
avi.http.response(200, {}, resp)

对于请求:https://demo.avinetworks.com/path1/index.html?a=b&c=&d=e

将返回以下内容:a:b, d:e, c:,

注:

事件 SSL_PRECONNECTSSL_CLIENTHELLOSSL_HANDSHAKE_DONE 不支持此 API。

avi.http.get_req_body([size_in_kb])

函数

avi.http.get_req_body([size_in_kb])

描述

返回客户端请求正文。如果请求正文中不存在任何数据(例如,如果请求不是 POST),则函数将返回 nil。

注:
  1. 通过 DDOS 选项卡下的应用程序配置文件或在 VMware NSX Advanced Load Balancer CLI 中启用 request_body_buffering

  2. 缓冲区大小在 client_max_body_size 中指定,但限制为最大 32 MB。

  3. client_max_body_size 的默认值为 0,被解释为无限制,但限制为 32 MB。

  4. 要设置 client_max_body_size,请使用 http_profile CLI 命令。

事件

HTTP_REQ_DATA

参数

size_in_kb:可选参数,指示要返回的最大负载,以千字节为单位。

如果未指定,那么将返回整个请求负载。

注:

虚拟服务可以接受的最大负载大小受 HTTP 配置文件的 DDoS 设置限制。

返回

如果数据存在,将返回存储在变量中的数据,否则将返回 nil

示例

HTTP_REQ_DATA 事件:

body = avi.http.get_req_body(4) 
if string.match(body, "RandomString") then   avi.http.response(404) 
end

avi.http.get_request_id()

函数

avi.http.get_request_id()

描述

获取请求的请求 ID。

事件

HTTP_REQ

HTTP_RESP

参数

无参数。

返回

请求 ID 的字符串值(XXXX-XXXX-XXXX,长度不是固定的)。

示例

1.将请求 ID 添加到应用程序日志:

id=avi.http.get_request_id()
avi.vs.log(id)

发送请求后,可以在应用程序日志中找到请求 ID:

DataScript 日志:[string "vs-1"]:2: 1Vt-RoC2-m5O6

2. 将请求 ID 添加到标头:

id=avi.http.get_request_id() avi.http.add_header("Request ID", id)

发送请求后,可以在标头中找到请求 ID:

Request ID: gQJ-0MYI-YZi6

注:

事件 SSL_PRECONNECTSSL_CLIENTHELLOSSL_HANDSHAKE_DONE 不支持此 API。

avi.http.get_reqvar()

函数

avi.http.get_reqvar()

描述

通过 avi.http.set_reqvar() 函数获取(读取)存储在变量中的数据。这些变量的范围涵盖 HTTP_REQHTTP_RESP 事件。通常,当必须在 HTTP 请求事件中存储(设置)数据而在 HTTP 响应事件期间检索(获取)数据时,将使用此函数。存储在 reqvar 函数中的数据的生命周期仅限于 HTTP 请求/响应事务。

响应完成后,将自动取消设置变量。任何 Lua 值都可以存储在此变量中。此变量类型可以供 VMware NSX Advanced Load Balancer 中的其他组件使用,而不仅仅是供 DataScript 使用。VMware NSX Advanced Load Balancer 支持在三个级别将数据存储在变量中。

  1. 对于仅在当前事件期间需要的变量数据,请将变量映射到数据。

var = 1
if var == 2 then ...

2. 对于必须在 HTTP 请求和响应事件(完整流)间保留下来的变量,请使用 avi.http.set_reqvar()avi.http.get_reqvar() 函数。

3. 对于需要在连接之间保存或镜像到支持虚拟服务的其他服务引擎的变量数据,请使用 avi.vs.table_insert()

事件

HTTP_REQ

HTTP_RESP

参数

Name:指定要声明的变量的名称。名称是一个字符串,并且必须用引号括起来。

返回

如果数据存在,将返回存储在变量中的数据。  否则将返回 nil。

相关

avi.http.set_reqvar()avi.http.set_reqvar 函数检索存储的变量。

示例

HTTP_REQ 事件:

avi.http.set_reqvar("foo", 10)

HTTP_RESP 事件:

if avi.http.get_reqvar("foo") > 5 then    avi.vs.log("Foo=" .. avi.http.get_reqvar("foo")) 
end
注:

事件 SSL_PRECONNECTSSL_CLIENTHELLOSSL_HANDSHAKE_DONE 不支持此 API。

avi.http.get_response_body(size [, offset])

函数

avi.http.get_response_body(size [,offset])

描述

从缓冲正文中的指定千字节偏移开始读取指定的千字节数(不超过 32,768 kB (32 MB))。如果未指定偏移,将从缓冲区的开头读取。LUA 脚本将仅处理一次缓冲的正文。

事件

HTTP_RESP_DATA

参数

size 是要读取的千字节数。如果指定,则最小值为 1。

可选的 offset 参数用于确定要读取第一个字节的千字节偏移。如果指定,则最小值为 1。如果未指定,则假定为 0,即从缓冲区的开头读取字节。

返回

如果数据存在,将返回存储在变量中的数据。否则将返回 nil。

相关

avi.http.set_response_body_buffer_size() 设置要缓冲的最大响应正文。

示例

响应数据事件脚本:

local body = avi.http.get_response_body(50)
if (body ~= nil) then
    local uuid = string.match(body, "uuid:(%w+)")
    if (uuid ~= nil) then
        local srv = avi.pool.server_ip()
        avi.vs.table_insert(uuid, srv)
    end
end

请求事件脚本:

uuid = avi.http.get_cookie("uuid") 
if ( uuid ~= nil) then 
    local srvr = avi.vs.table_lookup(uuid) 
    if (srvr ~= nil) then 
        avi.pool.select("pool-3", srvr) 
    end 
end

avi.http.get_uri( [false] )

函数

avi.http.get_uri( [false] )

描述

返回客户端请求的完整原始 URI(包括路径和查询)。

请求的突出显示部分包含在 URI 中:

http://www.avinetworks.com/path1/path2/index.html?a=b&c=d

事件

HTTP_REQ

HTTP_RESP

参数

当可选的 flag 设置为 false 时,将取消解析返回的 URI,即不是解码的 URI。

返回

URI 的字符串值。

示例

检查嵌入在请求中的分层 URI 双重编码攻击

if string.contains(avi.http.get_uri(), "%") then
  avi.vs.log("Probable Double Encoding attack, conn closed.")
  avi.http.close_conn()
  end 
注:

事件 SSL_PRECONNECTSSL_CLIENTHELLOSSL_HANDSHAKE_DONE 不支持此 API。

avi.http.get_userid( )

函数

avi.http.get_userid()

描述

返回与连接关联的用户 ID。DataScript 可以通过多种方式使用用户 ID,例如根据白名单或黑名单评估用户。此字段还用于在客户端日志中填充可搜索的 userid 字段。通过以下方法填充此字段,优先顺序如下:

Custom:DataScript 可以通过 avi.http.set_userid() 命令明确设置 userid。例如,DataScript 可以解析 Cookie 以获取用户名或会话 ID,并将值插入到 userid 字段中。

Basic Auth:如果在虚拟服务上启用了 HTTP 基本身份验证,并且客户端进行身份验证,将使用 username 字段填充 userid

Client Certificate:如果已启用客户端证书身份验证,将使用在 SSL/TLS 握手期间收到的客户端证书中的 user name 字段填充 userid

事件

HTTP_REQ

HTTP_RESP

参数

返回

用户 ID 的字符串,如果为空,则返回 nil

示例

如果存在 HTTP 标头 username,则将其值插入 userid 字段中,否则将该字段设置为 none

if not avi.http.get_userid() then    avi.http.redirect("http://login.foo.com") end

avi.http.hostname( )

函数

avi.http.hostname()

描述

从请求返回主机名。可以从以下源学习此字段,优先顺序如下:

  • 请求行中的主机名。

  • Host 请求标头字段中的主机名。

  • 与请求匹配的服务器名称。

注:

主机名不包括端口,即使请求行或主机标头的格式为 hostname:port 也是如此。

事件

HTTP_REQ

HTTP_RESP

参数

返回

客户端请求的主机名的字符串。它不包括端口。

示例 1

如果没有主机名,则关闭 TCP 连接。

host = avi.http.hostname() 
if not host then    
avi.http.close_conn() 
end

示例 2

将相对重定向的位置标头重写为绝对位置,并将其更改为 HTTPS。此 DataScript 必须应用于 HTTP Response 事件。

重写的标头必须如下所示:https://www.test.com/index.htm

loc = avi.http.get_header("Location")
if loc and string.beginswith(loc, "/") then    loc = "https://" .. avi.http.hostname() .. loc    
avi.http.replace_header("Location", loc) end
事件 SSL_PRECONNECTSSL_CLIENTHELLOSSL_HANDSHAKE_DONE 不支持此 API。

avi.http.internal_status()

函数

avi.http.internal_status()

描述

返回一个字符串,说明对后端服务器的请求失败的原因。用户可以使用此函数自定义不同类型故障的响应,在 VMware NSX Advanced Load Balancer 日志中记录原因等。

事件

RESP_FAILED

返回

失败原因

avi.http.method( )

函数

avi.http.method()

描述

返回客户端的请求方法,例如,GETPOST

事件

HTTP_REQ

HTTP_RESP

参数

返回

方法字符串

示例

method = avi.http.method() if method ~= "GET" or method ~= "POST" then    avi.http.response("403") end
注:

事件 SSL_PRECONNECTSSL_CLIENTHELLOSSL_HANDSHAKE_DONE 不支持此 API。

avi.http.protocol( )

函数

avi.http.protocol()

描述

以字符串形式返回连接的 HTTP 协议:http(对于普通 HTTP)或 https(对于 HTTPS)。

事件

HTTP_REQ

HTTP_RESP

参数

返回

返回 httphttps

示例

如果 HTTP 请求不是 SSL,则将其重定向到安全 HTTPS。

if avi.http.protocol() ~= "https" then    avi.http.redirect("https://" ..    avi.http.hostname() ..    avi.http.get_uri()) 
end
注:

事件 SSL_PRECONNECT、SSL_CLIENTHELLOSSL_HANDSHAKE_DONE 不支持此 API。

avi.http.oauth_get_token(TOKEN_TYPE)

函数

avi.http.oauth_get_token(TOKEN_TYPE)

描述

在建立会话后,从用户的 OAuth 会话中提取 TOKEN_TYPE 的令牌。可以进一步将令牌 (OAUTH_ACCESS_TOKEN or OAUTH_ID_TOKEN) 发送到后端应用程序。

事件

HTTP_REQ

HTTP_RESP

HTTP_RESP_DATA

HTTP_POST_AUTH

RESP_FAILED

HTTP_REQ_DATA

LB_DONE

参数

函数采用单个参数 TOKEN_TYPE

TOKEN_TYPE 可以是以下两种类型的 OAuth 令牌之一:

  • avi.OAUTH_ACCESS_TOKEN

  • avi.OAUTH_ID_TOKEN

返回

如果存在令牌,则将以字符串形式返回请求的令牌。否则,将返回 nil。

示例

提取 TOKEN_TYPE (avi.OAUTH_ACCESS_TOKEN) 的令牌。如果找到令牌,则会将其发送到授权标头下的后端。

token = avi.http.oauth_get_token(avi.OAUTH_ACCESS_TOKEN)
if token == nil then
  avi.vs.log("Token not found")
else
 avi.http.add_header("Authorization", token) 
end

avi.http.redirect( uri [,status] )

函数

avi.http.redirect( uri [,status] )

描述

向具有指定状态代码的指定 URI 发出 HTTP 重定向。此命令仅在 HTTP_REQ 中可用。如果需要在 HTTP_RESP 事件中执行重定向,请使用可用于编写响应的 avi.http.response()

事件

HTTP_REQ

参数

uri 是一个字符串,它是将当前请求重定向到的新 URI。

可选的 status 代码是表示重定向状态代码的数字。使用状态代码数字或常量字符串。支持的状态代码包括:

  • 301 avi.HTTP_MOVED_PERMANENTLY

  • 302 avi.HTTP_MOVED_TEMPORARILY

  • 307 avi.HTTP_TEMPORARY_REDIRECT

如果未提供状态代码,则默认值为 302。

返回

无返回值。

示例

将服务端口 80 上收到的 HTTP 请求重定向到端口 443。

if avi.vs.port() ~= "443" then    avi.http.redirect("https://" .. avi.http.hostname() .. avi.http.get_uri()) end

avi.http.remove_cookie( name1, [name2, ...] )

函数

avi.http.remove_cookie( name1, [name2, ...] )

描述

根据从中执行函数的当前上下文,从 HTTP 请求或响应中移除给定的 Cookie

事件

HTTP_REQ

HTTP_REQ_BODY

HTTP_RESP

参数

根据从中执行函数的当前上下文,从 HTTP 请求或响应中移除给定的 Cookie。如果未提供 Cookie 名称,则将移除该上下文中的所有 Cookie。

返回

示例

从请求或响应中移除两个 Cookie。

avi.http.remove_cookie( "jsessionid", "lang" )

从请求或响应中移除所有 Cookie:

avi.http.remove_cookie()

avi.http.remove_header( name )

函数

avi.http.remove_header( name )

描述

从当前请求或响应中移除指定 HTTP 标头的所有实例,具体取决于执行脚本的事件。

事件

HTTP_REQ

HTTP_RESP

LB_DONE

参数

name 是指定标头名称的字符串。name 不区分大小写。

返回

无返回值。

示例

移除可识别潜在服务器漏洞的服务器响应标头。

avi.http.remove_header("Server")
事件 SSL_PRECONNECTSSL_CLIENTHELLOSSL_HANDSHAKE_DONE 不支持此 API。

avi.http.replace_cookie( table )

函数

avi.http.replace_cookie( table )

描述

根据从中执行函数的当前上下文,替换 HTTP 请求或响应中的 Cookie。提供的参数允许修改现有的 Cookie 属性。如果指定的 Cookie 已存在,该函数将先移除该 Cookie 的所有现有实例,然后添加具有指定值的新 Cookie。如果 Cookie 尚不存在,该命令的行为与 avi.http.add_cookie 相同。

事件

HTTP_REQ

HTTP_RESP

参数

table,包含 Cookie 名称值对(对于 HTTP 请求上下文)和可选的其他 Cookie 属性值对,如路径、域等(对于 HTTP 响应)。

请求参数

HTTP 请求事件:将在 HTTP 请求的 Cookie 标头中替换 Cookie 值,如果不存在此类标头,则会添加 Cookie 标头。

avi.http.replace_cookie( name1, value1 [, name2, value2] )

name 是要修改的 Cookie 的名称。

value 是 Cookie 的新值。

在 HTTP 请求上下文中,所有参数都被视为 Cookie 名称值对,即函数将忽略 Cookie 属性,如“Domain”、“Path”等,并将它们视为另一个要被替换的 Cookie。

响应参数

HTTP 响应事件:在 HTTP 响应上下文中调用时,将在 HTTP 响应的 Set-Cookie 标头中替换 Cookie 值。如果此类标头不存在,则会创建 Set-Cookie 标头。

在 HTTP 响应上下文中,仅将前两个参数视为 Cookie 名称值对,后续参数将被视为 Cookie 属性,如 DomainPath 等及其相应的值。

avi.http.replace_cookie( name, value, path, domain, expires, maxage, secure, httponly )

name 是要修改的 Cookie 的名称。

value 是 Cookie 的新值或数据字段。

path 是 path 属性的值(字符串)。

domain 是 domain 属性的值(字符串)。

expires 是 expires 属性的值(整数)。

maxage 是 maxage 属性的值(整数)。

secure 是 secure 属性的值(布尔值)。

httponly 是 httponly 属性的值(布尔值)。

返回

HTTP 请求示例

示例方法 1:替换两个 Cookie 的值:jsessionid=123lang=en

cookie_table = {jsessionid="123", lang="en"}
avi.http.replace_cookie( cookie_table )

示例方法 2:替换两个 Cookie:jsessionid=123 和 lang=en

avi.http.replace_cookie( "jsessionid", "123", "lang", "en" )

HTTP 响应示例

示例 1:替换值为 123 并且具有属性 path=/ 和 domain=www.avinetworks.com 的 Cookie jsessionid,以在 HTTP 响应中生成以下标头:

Set-Cookie: jsessionid=123; path=/; domain=www.avinetworks.com

cookie_table = {jsessionid="123", path="/", domain="www.avinetworks.com"} 
avi.http.replace_cookie( cookie_table )

示例 2:在此格式中,顺序很重要。第三个参数必须是 path,第四个参数必须是 domain,第五个参数必须是 expires,第六个参数必须是 maxage,第七个参数必须是 httponly 标记,第八个参数必须是 secure 标记。

avi.http.replace_cookie( "jsessionid", "123", "/", "www.avinetworks.com" )

如果不需要 expiresmaxage 属性,将为每个参数传递值 0。

avi.http.replace_cookie( "jsessionid", "123", "/", "a.b.c", 0, 0, true, true)

avi.http.replace_header( name, value )

函数

avi.http.replace_header( name, value )

描述

将现有 HTTP 标头设置为指定的值,从而覆盖同名的所有现有标头。如果标头尚不存在,将添加该标头。标头名称不区分大小写,以便与现有标头匹配。

事件

HTTP_REQ

HTTP_RESP

LB_DONE

参数

name 是指定标头名称的字符串。

value 是指定新标头值的字符串。

返回

无返回值。

示例

修改 HTTP 请求中名为“X-Forwarded-For”的标头以附加虚拟服务 IP。

ff = avi.http.get_header("x_forwarded_for")
if xff then    
avi.http.replace_header("X-Forwarded-For", xff ..", ".. avi.vs_ip())
end
注:

事件 SSL_PRECONNECTSSL_CLIENTHELLOSSL_HANDSHAKE_DONE 不支持此 API。

avi.http.response( status, [headers, [body]] )

函数

avi.http.response (status, {headers}, body)

描述

使用自定义 HTTP 响应对 HTTP 请求做出响应。

事件

HTTP_REQ

HTTP_RESP

LB_DONE

参数

status 用于指定 HTTP 状态代码。请参阅下面的受支持状态代码列表。

可选的 headers 用于指定要在响应中添加标头的表。

使用的默认 content-type 为“text/plain”。因此,如果正文是某个其他 mime 类型(如“text/html”),则必须使用 headers 参数指定相应的 content-type。

可选的 body 标记是用于指定自定义 HTTP 响应正文的字符串。

要了解如何在返回的页面中插入图形,请参阅“从 DataScript 返回图像”。

受支持的状态代码

  • 200 - HTTP 正常

  • 301 - 已永久移动

  • 302 - 已找到

  • 303 - 查看其他

  • 307 - 临时重定向。

  • 400 - 错误请求

  • 401 - 未授权

  • 403 - 已禁止

  • 404 - 未找到 (404 - Not found)

  • 405 - 方法不允许使用

  • 413 - 请求实体过大

  • 414 - 请求 URI 过长

  • 429 - 请求过多

  • 451 - 由于法律原因不可用。

  • 501 - 未实现

  • 503 - 服务不可用

返回

无返回值。

示例

防止 Shellshock 攻击,并使用友好的消息通知攻击者。

local h = avi.http.get_headers()
for k, v in pairs(h) do
   if string.sub(v, 1, 2) == "()" and #v > 2 then
      avi.http.response(404, {content_type="text/html"},
      "Blocking Shellshock Attack!")
   end
end

avi.http.saml_session_decrypt( )

函数

avi.http.saml_session_decrypt()

描述

返回在客户端请求中找到的已解密 SAML 会话 Cookie 值。

事件

HTTP_REQ。

参数

无。

返回

已解密 SAML 会话 Cookie 的字符串(如果存在);否则返回 nil。

示例

如果存在 SAML 会话 Cookie,请执行以下操作:

cookie_val = avi.http.saml_session_decrypt()
if (cookie_val)

   – action to be executed

avi.http.scheme( )

函数

avi.http.scheme()

描述

将 HTTP 协议作为使用“://”串联的字符串返回。对于普通 HTTP,将返回“http://”,对于安全 HTTPS,将返回“https://”。

事件

HTTP_REQ

HTTP_RESP

参数

返回

返回“http://”或“https://”

示例

根据接收到的协议将客户端重定向到 test.com。

if avi.http.hostname() ~= "test.com" then  avi.http.redirect(avi.http.scheme() .. "test.com" .. avi.http.get_uri()) 
end

avi.http.secure( )

函数

avi.http.secure()

描述

如果客户端到虚拟服务的连接在 SSL/TLS 模式下运行,则返回字符串“on”,如果为 false,则返回空字符串。

事件

HTTP_REQ。

HTTP_RESP。

参数

无。

返回

字符串,如果为 true,则返回“on”,如果为 false,则返回“nil”。

示例

如果 HTTP 请求不是 SSL,则将其重定向到安全 HTTPS。

if avi.http.secure() ~= "on" then
   avi.http.redirect("https://" ..
   avi.http.hostname() ..
   avi.http.get_uri())
end

avi.http.set_path( new_uri )

函数

avi.http.set_path( new_uri )

描述

将当前 HTTP 请求的 URI 路径重写到 new_path,然后再将请求发送到服务器。此操作通常对客户端是透明的,这与重定向操作相反,因为重定向会强制客户端发送新请求并产生往返时间成本。

请求的突出显示部分包含在路径中:

http://www.avinetworks.com/path1/path2/index.html? a=b&c=d

事件

HTTP_REQ。

参数

必须指定新的 URI 路径。

返回

无返回值。

示例

在向服务器发送请求之前,通过将“/”附加到空白 URL 来保存重定向 RTT。

if avi.http.get_path() == nil then  
avi.http.set_path("/") 
end

avi.http.set_query( integer | string | table )

函数

avi.http.set_query( integer | string | table )

描述

设置请求的 URI 查询。

请求的突出显示部分包含在查询中:

http://www.avinetworks.com/path1/path2/index.html?a=b&c=d

在此示例中,a=b,a 是参数,b 是值。

事件

HTTP_REQ

参数

新查询可以是 integerstringtable。当输入为字符串时,它不得以“?”字符为前缀。如果输入为表时,通过将键视为参数,将值视为相应参数的值来构成查询字符串。

返回

不返回任何值。

示例

if avi.http.get_path() == "/sales" then    avi.http.set_path("/")    avi.http.set_query("sales=true") 
end

avi.http.set_reqvar()

函数

avi.http.set_reqvar()

描述

将 HTTP 请求事件中的任意数据设置(写入)到变量中。这些变量的范围涵盖 HTTP_REQHTTP_RESP 事件。它们的生命周期仅限于 HTTP 请求/响应事务,因此无需手动取消设置。任何 Lua 值都可以存储在此变量中。此变量类型可以供 VMware NSX Advanced Load Balancer 中的其他组件使用,而不仅仅是供 DataScript 使用。VMware NSX Advanced Load Balancer 支持在三个级别将数据存储在变量中。

1. 对于仅在当前事件期间需要的变量数据,请将变量映射到数据。

var = 1
if var == 2 then ...

2. 对于必须在 HTTP 请求和响应事件(完整流)间保留下来的变量,请使用 avi.http.set_reqvar() 和 avi.http.get_reqvar() 函数。

3. 对于需要在连接之间保存或镜像到支持虚拟服务的其他服务引擎的变量数据,请使用 avi.vs.table_insert()。

事件

HTTP_REQ HTTP_RESP。

参数

Name:指定要声明的变量的名称。  名称是一个字符串,并且必须用引号括起来。

Value:设置新声明的变量的值。  可能是字符串或整数。

返回

无。

版本

17.1+。

相关

avi.http.get_reqvar() 从 avi.http.set_reqvar function 函数检索存储的变量。

示例

HTTP_REQ 事件:

avi.http.set_reqvar("foo", 10)

HTTP_RESP 事件:

if avi.http.get_reqvar("foo") > 5 then    avi.vs.log("Foo=" .. avi.http.get_reqvar("foo")) end
注:

事件 SSL_PRECONNECTSSL_CLIENTHELLOSSL_HANDSHAKE_DONE 不支持此 API。

avi.http.set_response_body_buffer_size(size)

函数

avi.http.set_response_body_buffer_size( size )

描述

设置要缓冲的最大响应正文。

事件

HTTP_RESP

参数

size 是要缓冲的千字节数。其范围可以是 1 到 32,768 kB (32 MB)。

有关内存分配的说明:

对于来自后端服务器的响应,VMware NSX Advanced Load Balancer 最初分配 4 kB,对于大于该容量的响应,将以 48 KB 为单位进行分配,如下所示,其中 ACRB 是响应正文的实际长度:

  • 如果 ACRB < 4 kB,则分配 4 kB。

  • 如果 ACRB < avi.http.set_response_body_buffer_size(),则分配 4 kB + 48 kB * ((ACRB / 48 kB) +1)。

  • 如果 ACRB > avi.http.set_response_body_buffer_size(),则分配 4 kB + 48 kB * ((avi.http.set_response_body_buffer_size()/48 kB +1)。

返回

相关

avi.http.get_response_body() 从缓冲正文中的指定字节偏移开始读取指定的字节数(不超过 32,768 KB)。

示例 1

响应事件脚本:

avi.http.set_response_body_buffer_size(50)

avi.http.set_server_timeout( time )

函数

avi.http.set_server_timeout( time )

描述

为特定请求设置自定义超时值。默认情况下,VMware NSX Advanced Load Balancer 允许服务器在一小时内进行响应,但客户端通常会在此时间范围之前终止连接。此 timeout 函数对于需要快速响应(无论是否成功)的高速交易应用程序非常有用。

默认情况下,VMware NSX Advanced Load Balancer 会在服务器超时时发送 504(网关超时)错误。要更改 VMware NSX Advanced Load Balancer 发送的错误消息,请在 HTTP_RESP_FAILED 事件中添加其他代码。请参阅以下示例。

此函数指定的超时值以两种方式应用。首先,它适用于服务器 RTT,用于衡量与服务器建立连接所需要的时间。另外,相同的超时值也适用于应用程序响应时间,用于衡量从请求的最后一个字节离开 VMware NSX Advanced Load Balancer 服务引擎到收到应用程序响应的第一个字节的时间。如果任一时间超过超时值,都会向客户端发送 HTTP 504 响应。

WAF 检查或 HTTP 请求排队等功能不会对时间产生影响,因为它们会在请求离开服务引擎之前进行。

事件

HTTP_REQ。

HTTP_RESP。

参数

time 是建立服务器连接的时间长度(以毫秒为单位),也是从发送请求后到 Avi 收到响应的第一个字节的时间。

最小值为 1。

无最大时间长度。

默认情况下,VMware NSX Advanced Load Balancer 使用 3,600,000 毫秒(1 小时)。

返回

无返回值。

示例

适用于高频交易路径的请求强制实施严格的 3 秒超时,而其他路径则没有此限制。

- HTTP_REQ event
if string.beginswith(avi.http.get_path(), "/hft") then
avi.http.set_server_timeout(3000)
end

– HTTP_RESP_FAILED event
if avi.http.internal_status() == "504" then
avi.http.response(404,

{content_type="text/html"}
, "Server took too long to respond.")
end
注:

事件 SSL_PRECONNECTSSL_CLIENTHELLOSSL_HANDSHAKE_DONE 不支持此 API。

avi.http.set_uri( new_uri )

函数

avi.http.set_uri( new_uri )

描述

将当前 HTTP 请求的 URI 重写到 new_uri,然后再将请求发送到服务器。此操作对客户端是透明的,这与重定向操作相反,因为重定向会强制客户端发送新请求并产生往返时间成本。

请求的突出显示部分包含在 URI 中:

http://www.avinetworks.com/path1/path2/index.html?a=b&c=d

事件

HTTP_REQ。

参数

必须指定新的 URI。

返回

无返回值。

示例

通过主动向空白 URI 添加“/”字符来保存重定向 RTT。

if avi.http.get_uri() == nil then
   avi.http.set_uri("/")
end

avi.http.set_userid( )

函数

avi.http.set_userid()

描述

设置与连接关联的用户 ID。如果字段是通过 HTTP 基本身份验证或通过客户端证书填充的,则使用此命令设置此字段会覆盖该字段。

事件

HTTP_REQ。

HTTP_RESP。

参数

无。

返回

不返回任何值。

示例

如果 userid 不存在,请使用 JSessionID Cookie 值填充该值。

if not avi.http.get_userid() then
   if avi.http.get_cookie("jsessionid") then
      avi.http.set_userid(avi.http.get_cookie("jsessionid"))
   else avi.http.set_userid("Unknown")
   end
end

avi.http.status( )

函数

avi.http.status()

描述

将发送到客户端的响应状态代码。这可能与从服务器发送回的状态代码不同,因为 DataScript 可能会覆盖该状态代码。请参阅 avi.var.server_status 的示例。

事件

HTTP_RESP。

参数

无。

返回

状态代码的字符串,例如 200。

示例

if avi.http.status() == "400" then
   avi.http.response("404")
end

avi.http.update_cookie()

函数

avi.http.update_cookie( [context] )

描述

修改 HTTP 响应中的现有 Cookie 属性值。

如果指定的 Cookie(name) 存在

  • 如果现有 Cookie 中已存在一个或多个 Cookie 属性,则该函数会将提及的 Cookie 属性修改为 attribute_value

  • 如果一个或多个 Cookie 属性不存在,该函数会将提及的 Cookie 属性添加到 Cookie。

如果 Cookie 不存在,则不执行任何操作。

事件

HTTP_RESP。

参数

name:要修改的 Cookie 的名称。

attr:必须修改/添加的 Cookie(name) 的属性。

attr_val:要将其替换为现有 Cookie 属性值的值。

属性:

path 是 path 属性的值(字符串)。

domain 是 domain 属性的值(字符串)。

expires 是 expires 属性的值(整数)。

maxage 是 maxage 属性的值(整数)。

httponly 是 httponly 属性的值(布尔值)。

secure 是 secure 属性的值(布尔值)。

samesite 是 samesite 属性的值(整数),samesite 属性值:avi.http.Lax avi.http.None avi.http.Strict

返回

无。

示例 1 - 修改单个 Set-Cookie 属性:

服务器发送名为“name1”且路径为“/dummy”的简单 Cookie 的示例:

server cookie example :  Set-Cookie: name1=value1; path=/dummy

如果要将服务器 Cookie 路径修改为 /dummy1,可使用 DataScript 修改 path 属性:

avi.http.update_cookie("name1","path","/dummy1")

Set-Cookie 将修改为

Set-Cookie: name1=value1; Path=/dummy1

示例 2 - 添加并修改 Set-Cookie 属性:

服务器发送名为“name2”且路径为“/dummy”的简单 Cookie 的示例:

server cookie example:  Set-Cookie: name2=value2; path=/dummy

如果要将此服务器 Cookie 的 Domain 更新为“www.avinetworks2.com”,请使用 HttpOnly,将 path 修改为“/dummy2”,并将 expiry 设置为接下来的 30 分钟。用于添加和修改 Cookie 属性的 DataScript 示例:

cookie_name="name2"
if avi.http.cookie_exists(cookie_name) then
 avi.http.update_cookie(cookie_name, "expires", os.time() + 1800 , "path", "/dummy2", "domain", "www.avinetworks2.com", "httponly", true)
end

Set-Cookie 将修改为:

Set-Cookie: name2=value2; Path=/dummy2; Domain=www.avinetworks2.com; HttpOnly
注:
  • avi.http.update_cookie() API 对属性没有任何顺序要求。

  • 可以使用 avi.http.update_cookie() 修改或更新 Max-Age Cookie 属性。

  • avi.http.update_cookie() API 可用于向现有 Cookie 添加一个或多个属性。

  • 如果多次对同一个 Cookie 名称调用 avi.http.update_cookie(),则可能会导致为同一个 Cookie 名称创建多个 Set-Cookie 标头。因此,如果需要为同一个 Cookie 指定多个属性,请使用 API 在单个调用中更新多个属性,如上所示。

  • expires 从纪元开始时间 1970 年 1 月 1 日开始计算。因此,如果用户希望从当前时间起 1 小时后过期,则必须使用 os.time + 3600(因为以秒为单位)。

avi.http.disable_auth()

函数

avi.http.disable_auth(auth_type)

描述

禁用客户端身份验证。

事件

HTTP_AUTH

参数

SAML、LDAP、PAA、JWT。

返回

无返回值。

示例

if avi.http.get_path() == "/kb/" then 
avi.http.disable_auth(“SAML”)
end