DataScript 可用于检查客户端 HTTP 请求或服务器 HTTP 响应,并执行内容切换、重定向、标头操作、日志记录等。下表列出了 NSX Advanced Load Balancer 上可用的 HTTP DataScript。
字符串 |
描述 |
---|---|
插入新 Cookie。 |
|
插入新的标头和值。 |
|
关闭或重置 TCP 连接。 |
|
验证 Cookie 是否已存在。 |
|
升级(禁用)当前连接的 HTTP 处理,该操作随后将被视为 L4 TCP。 |
|
返回 Cookie 的值。 |
|
返回 Cookie 的名称。 |
|
返回标头名称或其值。 |
|
返回主机的子部分。 |
|
返回 URI 的路径 /path.index.htm。 |
|
返回路径的子部分。 |
|
avi.http.get_query( [arg_name | avi.QUERY_TABLE] [, decode] ) |
返回 URI 的查询 |
返回客户端请求正文的部分或整个内容。 |
|
返回请求 ID。 |
|
通过 |
|
从缓冲响应正文中的指定千字节偏移开始获取(读取)指定的千字节数。 |
|
返回 URI(路径加查询)。 |
|
返回会话的用户 ID。 |
|
返回客户端请求的主机名。 |
|
以字符串形式返回 HTTP 状态。 |
|
返回客户端的请求方法。 |
|
返回会话协议 http 或 https。 |
|
从用户的 OAuth 会话中提取 TOKEN_TYPE 令牌。 |
|
重定向请求。 |
|
移除现有 Cookie。 |
|
移除标头的所有实例。 |
|
替换现有 Cookie 的值。 |
|
替换现有标头的值。 |
|
发送定义的 HTTP 响应页面。 |
|
返回已解密 SAML 会话 Cookie(如果存在)的字符串;否则返回 nil。 |
|
返回 |
|
返回 |
|
修改请求的路径。 |
|
修改请求的查询。 |
|
将 HTTP 请求事件中的任意数据设置(写入)到变量中。这些变量的范围涵盖 |
|
设置要缓冲的最大响应正文。 |
|
为特定请求设置自定义超时值。 |
|
更改 URI。 |
|
设置会话的用户 ID。 |
|
返回要发送到客户端的状态代码。 |
|
修改 HTTP 响应中的现有 Cookie 属性值。 |
|
禁用客户端身份验证。 |
avi.http.add_cookie
函数 |
avi.http.add_cookie( table ) |
描述 |
在 HTTP 请求或响应中插入一个或多个新的 Cookie。如果 Cookie 已存在,VMware NSX Advanced Load Balancer 会将指定的值或标记附加到现有 Cookie。 |
事件 |
|
|
|
参数 |
HTTP 请求上下文的 Cookie 名称值对及 HTTP 响应的可选附加 Cookie 属性值对(如路径、域等)表。 |
请求参数 |
HTTP 请求事件:将 Cookie 名称值对添加到 HTTP 请求的 Cookie 标头中,如果不存在此类标头,则会添加 Cookie 标头。
name 是新 Cookie 的名称。 value 是新 Cookie 的值或数据字段。 在 HTTP 请求上下文中,所有参数都被视为 Cookie 名称值对,即函数将忽略 Cookie 属性,如“Domain”、“Path”等,并将它们视为要添加的另一个 Cookie。 |
响应参数 |
HTTP 响应事件:在 HTTP 响应上下文中调用时,会将 Cookie 名称值对添加 HTTP 响应的 Set-Cookie 标头中。如果此类标头不存在,则会创建 Set-Cookie 标头。 在 HTTP 响应上下文中,仅将前两个参数视为 Cookie 名称值对,后续参数将被视为 Cookie 属性,如 Domain、Path 等及其相应的值。
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:在此格式中,顺序很重要。第三、第四、第五、第六、第七和第八个参数必须分别是 path、domain、expires、maxage、httponly flag 和 secure flag。 avi.http.add_cookie( "jsessionid", "123", "/", "www.avinetworks.com" ) 如果不需要 expires 和 maxage 属性,那么会将值 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 |
参数 |
|
返回 |
无返回值。 |
示例 |
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 名称,则返回 |
事件 |
HTTP_REQ HTTP_REQ_BODY HTTP_RESP |
参数 |
name:它是指定 Cookie 名称的字符串。 context:指定 例如,在 HTTP 响应事件期间,检查客户端在请求事件期间发送的 Cookie。
注:
如果在 |
返回 |
如果 Cookie 名称存在,则返回布尔值 |
示例 |
如果 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 进行隧道传输。 借助 请注意,可以通过 HTTP 配置文件本机启用 Websocket 支持。某些应用程序协议使用的标头名称会略有不同,此时需要 DataScript。 可以在 HTTP 响应事件期间调用 |
事件 |
|
参数 |
无 |
返回 |
无 |
示例 |
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:指定 例如,在
注:
如果在 |
返回值 |
如果提供了 name:
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:
{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:指定 例如,在 HTTP 响应事件期间,通过传递 |
返回 |
一个表,其中包含 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 LB_DONE |
参数 |
如果未指定 name,将返回包含所有标头和相应值的键表。当明确重复标头时(例如,如果有多个 Set-Cookie 标头),表将包含标头的单个键,且值为表数组。 如果指定了 name,则将作为字符串仅返回指定标头的值。如果指定的标头重复,则只会返回第一个标头值。 context 标记允许从 |
返回 |
一个表,其中包含标头及其值或特定标头值的字符串。 |
示例 |
以下示例可用于防止 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]] ) |
描述 |
|
事件 |
HTTP_REQ HTTP_RESP |
参数 |
|
返回 |
如果未指定 如果指定了 |
示例 |
主机标头示例: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_PRECONNECT
、SSL_CLIENTHELLO
和 SSL_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 |
参数 |
|
返回 |
如果未指定 |
示例 |
示例: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_PRECONNECT
、SSL_CLIENTHELLO
和 SSL_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,a 是参数,b 是值。 |
事件 |
HTTP_REQ HTTP_RESP |
参数 |
如果未指定任何参数,则会返回完整查询。如果指定了 arg_name,并且查询中存在该参数,则会返回其值。 如果指定了标记 avi.QUERY_TABLE,将返回包含所有参数的表。
默认情况下,将作为已解码的 URI 返回查询。例如,‘/’ 而非 %2F。decode 参数将对返回的值进行 URI 解码。 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_PRECONNECT
、SSL_CLIENTHELLO
和 SSL_HANDSHAKE_DONE
不支持此 API。
avi.http.get_req_body([size_in_kb])
函数 |
avi.http.get_req_body([size_in_kb]) |
描述 |
返回客户端请求正文。如果请求正文中不存在任何数据(例如,如果请求不是 POST),则函数将返回 nil。
注:
|
事件 |
HTTP_REQ_DATA |
参数 |
size_in_kb:可选参数,指示要返回的最大负载,以千字节为单位。 如果未指定,那么将返回整个请求负载。
注:
虚拟服务可以接受的最大负载大小受 HTTP 配置文件的 DDoS 设置限制。 |
返回 |
如果数据存在,将返回存储在变量中的数据,否则将返回 |
示例 |
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 日志: 2. 将请求 ID 添加到标头: id=avi.http.get_request_id() avi.http.add_header("Request ID", id) 发送请求后,可以在标头中找到请求 ID:
|
事件 SSL_PRECONNECT
、SSL_CLIENTHELLO
和 SSL_HANDSHAKE_DONE
不支持此 API。
avi.http.get_reqvar()
函数 |
avi.http.get_reqvar() |
描述 |
通过 响应完成后,将自动取消设置变量。任何 Lua 值都可以存储在此变量中。此变量类型可以供 VMware NSX Advanced Load Balancer 中的其他组件使用,而不仅仅是供 DataScript 使用。VMware NSX Advanced Load Balancer 支持在三个级别将数据存储在变量中。
var = 1 if var == 2 then ... 2. 对于必须在 HTTP 请求和响应事件(完整流)间保留下来的变量,请使用 3. 对于需要在连接之间保存或镜像到支持虚拟服务的其他服务引擎的变量数据,请使用 |
事件 |
HTTP_REQ HTTP_RESP |
参数 |
Name:指定要声明的变量的名称。名称是一个字符串,并且必须用引号括起来。 |
返回 |
如果数据存在,将返回存储在变量中的数据。 否则将返回 nil。 |
相关 |
|
示例 |
avi.http.set_reqvar("foo", 10)
if avi.http.get_reqvar("foo") > 5 then avi.vs.log("Foo=" .. avi.http.get_reqvar("foo")) end |
事件 SSL_PRECONNECT
、SSL_CLIENTHELLO
和 SSL_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 |
事件 |
HTTP_REQ HTTP_RESP |
参数 |
当可选的 flag 设置为 |
返回 |
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_PRECONNECT
、SSL_CLIENTHELLO
和 SSL_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 字段中,否则将该字段设置为 if not avi.http.get_userid() then avi.http.redirect("http://login.foo.com") end |
avi.http.hostname( )
函数 |
avi.http.hostname() |
描述 |
从请求返回主机名。可以从以下源学习此字段,优先顺序如下:
注:
主机名不包括端口,即使请求行或主机标头的格式为 hostname:port 也是如此。 |
事件 |
HTTP_REQ HTTP_RESP |
参数 |
无 |
返回 |
客户端请求的主机名的字符串。它不包括端口。 |
示例 1 |
如果没有主机名,则关闭 TCP 连接。 host = avi.http.hostname() if not host then avi.http.close_conn() end |
示例 2 |
将相对重定向的位置标头重写为绝对位置,并将其更改为 HTTPS。此 DataScript 必须应用于 重写的标头必须如下所示: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_PRECONNECT
、
SSL_CLIENTHELLO
和
SSL_HANDSHAKE_DONE
不支持此 API。
avi.http.internal_status()
函数 |
avi.http.internal_status() |
描述 |
返回一个字符串,说明对后端服务器的请求失败的原因。用户可以使用此函数自定义不同类型故障的响应,在 VMware NSX Advanced Load Balancer 日志中记录原因等。 |
事件 |
RESP_FAILED |
返回 |
失败原因 |
avi.http.method( )
函数 |
avi.http.method() |
描述 |
返回客户端的请求方法,例如, |
事件 |
HTTP_REQ HTTP_RESP |
参数 |
无 |
返回 |
方法字符串 |
示例 |
method = avi.http.method() if method ~= "GET" or method ~= "POST" then avi.http.response("403") end |
事件 SSL_PRECONNECT
、SSL_CLIENTHELLO
和 SSL_HANDSHAKE_DONE
不支持此 API。
avi.http.protocol( )
函数 |
avi.http.protocol() |
描述 |
以字符串形式返回连接的 HTTP 协议:http(对于普通 HTTP)或 https(对于 HTTPS)。 |
事件 |
HTTP_REQ HTTP_RESP |
参数 |
无 |
返回 |
返回 http 或 https |
示例 |
如果 HTTP 请求不是 SSL,则将其重定向到安全 HTTPS。 if avi.http.protocol() ~= "https" then avi.http.redirect("https://" .. avi.http.hostname() .. avi.http.get_uri()) end |
事件 SSL_PRECONNECT
、SSL_CLIENTHELLO
和 SSL_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 令牌之一:
|
返回 |
如果存在令牌,则将以字符串形式返回请求的令牌。否则,将返回 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 |
参数 |
uri 是一个字符串,它是将当前请求重定向到的新 URI。 可选的 status 代码是表示重定向状态代码的数字。使用状态代码数字或常量字符串。支持的状态代码包括:
如果未提供状态代码,则默认值为 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_PRECONNECT
、
SSL_CLIENTHELLO
和
SSL_HANDSHAKE_DONE
不支持此 API。
avi.http.replace_cookie( table )
函数 |
avi.http.replace_cookie( table ) |
描述 |
根据从中执行函数的当前上下文,替换 HTTP 请求或响应中的 Cookie。提供的参数允许修改现有的 Cookie 属性。如果指定的 Cookie 已存在,该函数将先移除该 Cookie 的所有现有实例,然后添加具有指定值的新 Cookie。如果 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 属性,如 Domain、Path 等及其相应的值。 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=123 和 lang=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:替换值为
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" ) 如果不需要 expires 和 maxage 属性,将为每个参数传递值 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_PRECONNECT
、SSL_CLIENTHELLO
和 SSL_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 返回图像”。 |
受支持的状态代码 |
|
返回 |
无返回值。 |
示例 |
防止 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 模式下运行,则返回字符串“ |
事件 |
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 |
事件 |
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,a 是参数,b 是值。 |
事件 |
HTTP_REQ |
参数 |
新查询可以是 |
返回 |
不返回任何值。 |
示例 |
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 请求事件中的任意数据设置(写入)到变量中。这些变量的范围涵盖 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_PRECONNECT
、SSL_CLIENTHELLO
和 SSL_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 是响应正文的实际长度:
|
返回 |
无 |
相关 |
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 发送的错误消息,请在 此函数指定的超时值以两种方式应用。首先,它适用于服务器 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_PRECONNECT
、SSL_CLIENTHELLO
和 SSL_HANDSHAKE_DONE
不支持此 API。
avi.http.set_uri( new_uri )
函数 |
avi.http.set_uri( new_uri ) |
描述 |
将当前 HTTP 请求的 URI 重写到 new_uri,然后再将请求发送到服务器。此操作对客户端是透明的,这与重定向操作相反,因为重定向会强制客户端发送新请求并产生往返时间成本。 请求的突出显示部分包含在 URI 中: http://www.avinetworks.com |
事件 |
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 不存在,则不执行任何操作。 |
事件 |
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 属性值: |
返回 |
无。 |
示例 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 |