本节将介绍各种 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