このセクションでは、さまざまな DataScript 関数とその構成について説明します。

カスタム データのログ

カスタム データを使用してローカル ログを作成します。このログはアプリケーション ログから確認でき、仮想サービスの分析プロファイルでユーザー定義フィルタが構成されている場合は、リモート ログ サーバに送信できます。このログに記録されたデータは、要求に対して生成された標準ログ データに追加されます。

avi.vs.log("This is a custom log. The clients IP address is " .. avi.vs.client_ip())

JsessionID の保持

次の例では、クライアントをサーバに 1 時間保持するための値を使用して、サーバによって生成された Cookie を確認します。この使用事例は、ネイティブの app-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 にリダイレクト

クライアントが Web サイトの安全なセクションにアクセスしていて、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 環境ではこれが一般的な要件になる可能性があります。

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