本节将介绍各种 Datascript 函数及其配置。
记录自定义数据
使用自定义数据创建本地日志。此日志在应用程序日志中可见,如果在虚拟服务的分析配置文件中配置了用户定义的筛选器,则可以将其发送到远程日志记录服务器。此记录的数据将附加到为请求生成的标准日志数据。
avi.vs.log("This is a custom log. The clients IP address is " .. avi.vs.client_ip())
持久保存在 JsessionID 上
以下示例将查看服务器生成的 Cookie,并使用该值将客户端保持连接服务器一小时。也可以通过本机应用程序 Cookie 持久性方法执行此用例。
向 HTTP 请求添加以下内容。
if avi.http.get_cookie("OAM_JSESSIONID") then if avi.vs.table_lookup(avi.http.get_cookie("OAM_JSESSIONID")) then avi.pool.select(avi.vs.table_lookup(avi.http.get_cookie("JSESSIONID"))) end end
向 HTTP 响应添加以下内容。
if avi.http.get_cookie("JSESSIONID") ~= "" then avi.vs.table_insert(avi.http.get_cookie("JSESSIONID"), avi.pool.server_ip(), 3600) end
将 HTTP 重定向到 HTTPS
如果客户端访问网站的安全部分,但未使用 SSL,则使用 302 重定向将其重定向到 HTTPS。
if string.beginswith(avi.http.get_path(), "/secure") and avi.vs.port() ~= "443" then avi.http.redirect("https://" .. avi.http.hostname() .. avi.http.get_uri(), 302) end
IP 地址的阻止列表实施
根据客户端 IP 地址阻止来自指定阻止列表组的客户端。要实施此规则,请创建一个与以下规则中使用的名称匹配的 IP 组:
var = avi.vs.client_ip() if avi.ipgroup.contains("IP-Group", var) then avi.vs.log("Blacklisted IP" .. var.. "attempting to log in") avi.http.close_conn() end
内容切换 - 基本
此规则根据 HTTP 路径的完全匹配项将客户端定向到池。
if avi.http.get_path() == "/sales/" then avi.pool.select("sales-pool") elseif avi.http.get_path() == "/dev/" then avi.pool.select("dev-pool") elseif avi.http.get_path() == "/marketing/" then avi.pool.select("marketing") end
内容切换 - 高级
此规则根据客户端路径的匹配项将客户端定向到不同的池或池中的服务器:
if string.beginswith(avi.http.get_path(), "/sales/") then avi.pool.select("sales-pool") elseif avi.http.get_path() == "/engineering/" then avi.pool.select("engineering-pool", "apache1") elseif avi.http.get_path() == "/marketing/" then avi.pool.select("marketing", "10.10.31.201") end
内容切换 - 大列表
对于超长列表,最好将 DataScript 代码与其使用的数据分开。这样,无需授予用户(或自动化 API 调用)对底层规则的访问权限,即可轻松添加或修改映射列表。此方法会利用包含列表并由 DataScript 引用的字符串组。
字符串组必须设置为键/值对,并包含示例条目,例如:
/marketing marketing-pool
/dev dev-pool
/checkout default-pool
/nonprod nonprod-pool
/test nonprod-pool
/sales sales
val, match = avi.stringgroup.beginswith("StringGroup", avi.http.get_path()) if match then avi.pool.select(val) else avi.pool.select("default-pool") end
重写客户端请求
根据 HTTP 主机名的国家/地区代码向请求添加查询。
例如,如果站点为 www.avi.es/path/index.html?query=true,则新请求将为 www.avi.es/path/index.html?es=0123&query=true。
host = avi.http.host() -- Create an array of mappings TLD_map = {es="123", fi="456", cn="789"} if not host then -- The host header does not exist, so close the connection avi.http.close_conn() elseif string.sub(host, 1, #"www.avi.") == "www.avi." then i,j = string.find(host, "avi") TLD = string.sub(host, j+2, -1) new_query = "?mandate=" .. TLD_map[TLD] old_query = avi.http.get_query() if old_query > 0 then new_query = new_query .. "&" .. old_query end avi.http.redirect("www.avi.com" .. avi.http.get_path() .. new_query, 302) end
根据不同的主机名生成不同的重定向 URL
检查主机名是否以 www.avi.
开头,然后从主机中获取 ccTLD。使用 ccTLD 映射表形成新查询的开头部分,以获取查询参数授权的值。将旧查询(如果存在)附加到新查询。使用域 www.avi.com
和新查询生成到新 URL 的 HTTP 重定向。
local ccTLD_map = {es="01345F", fi="5146FF", cn="45DFX", io="123456", ly="ABC123"} host = avi.http.host() if not host then avi.http.close_conn() elseif string.sub(host, 1, #"www.avi.") == "www.avi." then i,j = string.find(host, "avi") ccTLD = string.sub(host, j+2, -1) new_query = "?mandate=" .. ccTLD_map[ccTLD] old_query = avi.http.get_query() if #old_query > 0 then new_query = new_query .. "&" .. old_query end avi.http.redirect("www.avi.com" .. avi.http.get_path() .. new_query, 302) end
将公开可用的主机和 URL 重写到专用主机和 URL &dmash
这是 OpenShift 环境的一个常见要求,因为路由通常不开放且无法直接从 Internet 访问。
host = avi.http.get_header("Host") path = avi.http.get_path() if string.contains(host, "rhmap.global.acme.com") and string.beginswith (path, "/router/test") then avi.vs.log("router/test match") avi.http.replace_header ("Host", avi.http.get_path_tokens(3,3) ..".".."apps.test-a.0341.o2.we1.csl.cd2.acme.com") avi.vs.log ("router/test new header") if avi.http.get_path_tokens(4) then avi.http.set_path ("/"..avi.http.get_path_tokens(4)) else avi.http.set_path ("/") end elseif string.contains(host, "rhmap.global.acme.com") and string.beginswith (path, "/router/dev") then avi.vs.log("router/dev match") avi.http.replace_header ("Host", avi.http.get_path_tokens(3,3) ..".".."apps.test-a.0341.o2.we1.csl.cd2.acme.com") avi.vs.log ("router/dev new header") if avi.http.get_path_tokens(4) then avi.http.set_path ("/"..avi.http.get_path_tokens(4)) else avi.http.set_path ("/") end elseif string.contains(host, "rhmap.global.acme.com") and string.beginswith (path, "/core") then avi.vs.log("core match") avi.http.replace_header ("Host", "rhmap.apps.test-a.0341.o2.we1.csl.cd2.acme.com") avi.vs.log ("core new header") avi.http.set_path ("/"..avi.http.get_path_tokens(2)) else avi.vs.log ("nothing matches") end