このセクションでは、さまざまな 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