DataScript を使用して、クライアント HTTP 要求またはサーバ HTTP 応答を検査し、コンテンツ スイッチング、リダイレクト、ヘッダー操作、ログ作成などを実行できます。次の表に、NSX Advanced Load Balancer で使用可能な HTTP DataScript を示します。

文字列

説明

DataScript: avi.http.add_cookie( table )

新しい Cookie を挿入します。

DataScript: avi.http.add_header( name, value )

新しいヘッダーと値を挿入します。

avi.http.close_conn( [reset] )

TCP 接続を終了するか、リセットします。

DataScript: avi.http.cookie_exists( name, [context] )

Cookie がすでに存在するかどうかを検証します。

DataScript: avi.http.disable()

現在の接続の HTTP 処理をアップグレード(無効化)します。その後、レイヤー 4 TCP として扱われます。

avi.http.get_cookie( name [, context] )

Cookie の値を返します。

avi.http.get_cookie_names ( [context] )

Cookie の名前を返します。

avi.http.get_header( [[name] [context]] )

ヘッダー名またはその値を返します。

avi.http.get_host_tokens( [start [, end]] )

ホストのサブセクションを返します。

avi.http.get_path( [false] )

URI のパス /path.index.htm を返します。

avi.http.get_path_tokens( [start [, end]] )

パスのサブセクションを返します。

avi.http.get_query( [arg_name | avi.QUERY_TABLE] [, decode] )

URI のクエリ ?a=1&b=2 を返します。

avi.http.get_req_body([size_in_kb])

クライアント要求本文の一部または全体を返します。

avi.http.get_request_id()

要求 ID を返します。

avi.http.get_reqvar()

avi.http.set() 関数を介して、変数に格納されているデータを取得(読み取り)します。

avi.http.get_response_body(size [, offset])

バッファされた応答本文から、指定したキロバイト オフセットから開始して、指定された数のキロバイトを取得(読み取り)します。

avi.http.get_uri( [false] )

URI(パスとクエリ)を返します。

avi.http.get_userid( )

セッションのユーザー ID を返します。

avi.http.hostname( )

クライアントによって要求されたホスト名を返します。

avi.http.internal_status()

HTTP 状態を文字列として返します。

avi.http.method( )

クライアントの要求メソッドを返します。

avi.http.protocol( )

セッション プロトコル(http または https)を返します。

avi.http.oauth_get_token(TOKEN_TYPE)

ユーザーの OAuth セッションから TOKEN_TYPE のトークンを抽出します。

avi.http.redirect( uri [,status] )

要求をリダイレクトします。

avi.http.remove_cookie( name1, [name2, ...] )

既存の Cookie を削除します。

avi.http.remove_header( name )

ヘッダーのすべてのインスタンスを削除します。

avi.http.replace_cookie( table )

既存の Cookie の値を置き換えます。

avi.http.replace_header( name, value )

既存のヘッダーの値を置き換えます。

)avi.http.response( status, [headers, [body]] )

定義済みの HTTP 応答ページを送信します。

avi.http.saml_session_decrypt( )

復号された SAML セッションの Cookie が存在する場合は、その文字列を返します。それ以外の場合は nil。

avi.http.scheme( )

http:// または https:// を返します。

avi.http.secure( )

https の場合は onhttp. の場合は nil を返します

avi.http.set_path( new_uri )

要求のパスを変更します。

avi.http.set_query( integer | string | table )

要求のクエリを変更します。

avi.http.set_reqvar()

HTTP 要求イベントから任意のデータを変数に設定(書き込み)します。これらの変数には、HTTP_REQ イベントと HTTP_RESP イベントの範囲があります。

avi.http.set_response_body_buffer_size(size)

バッファする最大応答本文を設定します。

avi.http.set_server_timeout( time )

特定の要求のカスタム タイムアウト値を設定します。

avi.http.set_uri( new_uri )

URI を変更します。

avi.http.set_userid( )

セッションのユーザー ID を設定します。

avi.http.status( )

クライアントに送信される状態コードを返します。

avi.http.update_cookie()

HTTP 応答の既存の Cookie 属性値を変更します。

avi.http.disable_auth()

クライアント認証を無効にします。

avi.http.add_cookie

機能

avi.http.add_cookie( table )

説明

HTTP 要求または応答に 1 つまたは複数の新しい Cookie を挿入します。Cookie がすでに存在する場合、VMware NSX Advanced Load Balancer は指定された値またはフラグを既存の Cookie に追加します。

イベント

HTTP_REQ

HTTP_RESP

パラメータ

Cookie の名前と値のペア(HTTP 要求コンテキスト用)と、必要に応じてパス、ドメインなどの追加の Cookie 属性値ペアのテーブル(HTTP 応答用)。

要求パラメータ

HTTP 要求イベント:Cookie の名前と値のペアが HTTP 要求の Cookie ヘッダーに追加され、そのようなヘッダーが存在しない場合は Cookie ヘッダーが追加されます。

avi.http.add_cookie( name1, value1 [, name2, value2] )

name は新しい Cookie の名前です。

value は新しい Cookie の値またはデータ フィールドです。

HTTP 要求コンテキストで、すべての引数は Cookie の名前と値のペアとして扱われます。つまり、関数は「ドメイン」、「パス」などの Cookie 属性を無視し、それらを、追加する別の Cookie として扱います。

応答パラメータ

HTTP 応答イベント:HTTP 応答コンテキストで呼び出されると、HTTP 応答の Set-Cookie ヘッダーに Cookie の名前と値のペアが追加されます。そのようなヘッダーが存在しない場合は、Set-Cookie ヘッダーが作成されます。

HTTP 応答コンテキストでは、最初の 2 つの引数のみが Cookie の名前と値のペアとして扱われ、後続の引数は DomainPath などの Cookie 属性とそれに対応する値として解釈されます。

avi.http.add_cookie( name, value, path, domain, expires, maxage, httponly, secure )

name は新しい Cookie の名前です。

value は新しい Cookie の値またはデータ フィールドです。

path は、path 属性の値(文字列)です。

domain は、domain 属性の値(文字列)です。

expires は、expires 属性の値(整数)です。

maxage は、maxage 属性の値(整数)です。

httponly は、httponly 属性の値(ブール値)です。

secure は、secure 属性の値(ブール値)です。

戻り値

なし。

HTTP 要求の例

メソッドの例 1:2 つの Cookie を追加:jsessionid=123 と lang=en

cookie_table = {jsessionid="123", lang="en"}avi.http.add_cookie( cookie_table )

メソッドの例 2:2 つの Cookie を追加:jsessionid=123 と lang=en

avi.http.add_cookie( "jsessionid", "123", "lang", "en" )

HTTP 応答の例

例 1:値 123 の Cookie jsessionid と path=/ および domain=www.avinetworks.com の属性を追加して、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:この形式では、順序が重要です。3 番目、4 番目、5 番目、6 番目、7 番目、8 番目の引数は、それぞれ、pathdomainexpiresmaxagehttponly 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 が含まれている場合に、X-Foo という名前のヘッダーを値 Bar で HTTP 要求に追加します。

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

パラメータ

reset フラグは、デフォルトの FIN を使用するのではなく、接続を RST します。

戻り値

戻り値はありません。

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 名が存在する場合に true を返します。コンテキストによって要求か応答かが決まります。コンテキストが指定されていない場合、デフォルトのコンテキストは DataScript が実行されたイベントに基づきます。

イベント

HTTP_REQ

HTTP_REQ_BODY

HTTP_RESP

パラメータ

name:Cookie 名を指定する文字列です。

context:現在のイベント コンテキストから Cookie を検査するのではなく、avi.HTTP_REQUEST または avi.HTTP_RESPONSE のいずれかのコンテキストを指定して、これらのイベントから Cookie を検査します。

たとえば、HTTP 応答イベント中に、クライアントによって要求イベント中に送信された Cookie を確認します。

注:

HTTP_REQ イベントまたは HTTP_REQ_BODY イベントで関数を呼び出す場合、get_cookie のコンテキスト引数として avi.HTTP_RESPONSE を指定することはできません。

戻り値

Cookie 名が存在する場合はブール値 true。それ以外の場合は false

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 をトンネリングします。

avi.http.disable() 機能を使用すると、DataScript は HTTP 経由のクライアントからサーバのハンドシェイクをモニターし、プロトコルが HTTP 以外に切り替わると HTTP プロセスを無効にできます。

Websocket のサポートは、HTTP プロファイルを使用してネイティブに有効にできます。一部のアプリケーション プロトコルでは、使用するヘッダーの名前が若干異なります。このときに、DataScript が必要になります。

avi.http.disable() 関数は、HTTP 応答イベント中に呼び出すことができます。サービス エンジンはサーバの応答をクライアントに送信し、現在の接続の HTTP 処理をアップグレード(無効化)します。その後、レイヤー 4 TCP として扱われます。SSL ターミネーションが実行されている場合、このプロセスは中断することなく続行されます。接続に対して HTTP 処理を再度有効にすることはできません。

イベント

HTTP_RESP

パラメータ

なし

戻り値

なし

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:現在のイベント コンテキストから Cookie を検査するのではなく、avi.HTTP_REQUEST または avi.HTTP_RESPONSE のいずれかのコンテキストを指定して、これらのイベントから Cookie を検査します。

たとえば、HTTP response イベント中に、クライアントによって要求イベント中に送信された Cookie を確認します。

注:

HTTP_REQ イベントまたは HTTP_REQ_BODY イベントで関数を呼び出す場合、get_cookie のコンテキスト引数として avi.HTTP_RESPONSE を指定することはできません。

戻り値

名前が指定されている場合:

  • Cookie の値が存在する場合はその文字列。それ以外の場合は nil

  • HTTP_RESP でのみ、&& はコンテキスト引数として avi.HTTP_REQUEST を提供しませんでした):応答に表示される Set-Cookie ヘッダーで提供される属性のテーブル。Key:属性名、Value:属性値

すべての

Set-Cookie: A1=foobar; path=/path/to/file/; Domain=avinetworks.com; secure; HTTPOnly

テーブルは次のようになります。

{path = '/path/to/file/', Domain = 'avinetworks.com', secure = true, HTTPOnly = true}

名前が指定されていない場合:

  • 要求ヘッダーまたは応答ヘッダーで提供されるすべての Cookie のテーブル。キー:Cookie 名、値:Cookie の値

{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 を返します。コンテキストが指定されていない場合は、DataScript を実行したイベントに基づいて選択されます。

イベント

HTTP_REQ

HTTP_REQ_BODY

HTTP_RESP

パラメータ

Context:現在のイベント コンテキストから Cookie を検査する代わりに、avi.HTTP_REQUEST または avi.HTTP_RESPONSE のいずれかのコンテキストを指定して、これらのイベントから Cookie を検査します。

たとえば、HTTP 応答イベント中に、avi.HTTP_REQUEST を渡して、クライアントによって要求イベント中に送信された Cookie を確認します。

戻り値

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_RESP イベントのサーバ応答ヘッダーと、HTTP_REQ イベント内で実行されるときはクライアント要求ヘッダーに対して実行されます。

イベント

HTTP_REQ

HTTP_RESP

LB_DONE

パラメータ

名前が指定されていない場合は、すべてのヘッダーのキー付きテーブルと、対応する値が返されます。ヘッダーが明示的に繰り返される場合(たとえば、複数の Set-Cookie ヘッダーがある場合)、テーブルにはテーブル配列である値を持つヘッダーの単一のキーが含まれます。

名前が指定されている場合は、指定されたヘッダーの値のみが文字列として返されます。指定されたヘッダーが繰り返される場合は、最初のヘッダー値のみが返されます。

コンテキスト フラグを使用すると、avi.HTTP_REQUEST または avi.HTTP_RESPONSE イベントのヘッダー値を検査できます。たとえば、HTTP_RESP イベント中に、クライアント要求ヘッダーを検査できます。

戻り値

ヘッダーとその値のテーブル、または特定のヘッダー値の文字列。

次の例は、ShellShock 攻撃を防ぐために使用できます。この攻撃は、() の文字で始まるクライアント ヘッダーを組み込みます。

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]]) or avi.http.get_host_tokens( [start [, end]] )

説明

  • avi.http.get_host_tokens("MODIFIED") または avi.http.get_host_tokens("MODIFIED", start) または avi.http.get_host_tokens("MODIFIED", start, end):更新された Host ヘッダー トークンを返します。たとえば、HTTP ポリシーの URL の書き換えアクションによって Host ヘッダーが上書きされた場合などです。

  • avi.http.get_host_tokens( [start [, end]] ):ホスト名から個々のホスト セクションまたはトークンを取得します(区切り文字「.」で区切られた文字列)。これは、引数なしで呼び出された場合です。このコマンドを使用すると、開始インデックスまたは終了インデックスが指定されている場合に、ホスト トークンのセクション(以下の例を参照)を柔軟に取得できます。

イベント

HTTP_REQ

HTTP_RESP

パラメータ

start または end インデックス。これにより、Host ヘッダーのセクションを解析できます。

戻り値

start および end インデックスが指定されていない場合、すべてのホスト トークンのテーブルを返します。

start インデックス、または start インデックスと end インデックスの両方が指定されている場合、文字列を返します。

Host ヘッダーの例:http://www.avinetworks.com/a/b/index.htm?avi=true

www.vmware.com へのリダイレクト アクションを含む HTTP 要求ポリシーがある場合

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
注:

この API は、イベント SSL_PRECONNECTSSL_CLIENTHELLO、および SSL_HANDSHAKE_DONE ではサポートされていません。

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

パラメータ

start インデックスと end インデックスを使用すると、パスのセクションを解析できます。これらのパラメータは整数で表されます。

戻り値

start および end インデックスが指定されていない場合、すべてのパス トークンの Lua テーブルを返します。start インデックスが指定されているか、start インデックスと end インデックスの両方が指定されている場合、文字列を返します。

例: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)
注:

この API は、イベント SSL_PRECONNECTSSL_CLIENTHELLO、および SSL_HANDSHAKE_DONE ではサポートされていません。

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&c=d.

この例の a=b で、a が引数で、b が値です。

イベント

HTTP_REQ

HTTP_RESP

パラメータ

パラメータが指定されていない場合は、完全なクエリが返されます。arg_name が指定され、その引数がクエリに存在する場合、その値が返されます。

フラグ avi.QUERY_TABLE を指定すると、すべての引数を持つテーブルが返されます。

  • このテーブルの引数は常に URI デコードされます。

  • クエリ内で引数が複数回発生した場合、キーの対応する値は、キーの値を保持するテーブルになります。

  • 引数キーに値がない場合、返される値はブール値の true になります。

  • 引数に空の値 (/index.htm?a=&c=d) を指定すると、キーの値は空になります。

デフォルトでは、クエリは URI デコードとして返されます。たとえば、%2F ではなく、「/」です。decode パラメータは、返された値を URI デコードします。

デコード パラメータのデフォルト値は true です。デコード パラメータを false として指定すると、クエリはデコードされていない URI を返します。

注:

指定された形式の引数が avi.QUERY_TABLE の場合、デコード パラメータは効果がありません。

戻り値

返されたクエリの文字列、個々の引数と値、または引数名がキーであるすべての引数と値を保持するテーブル。

例 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:,

注:

この API は、イベント SSL_PRECONNECTSSL_CLIENTHELLO、および SSL_HANDSHAKE_DONE ではサポートされていません。

avi.http.get_req_body([size_in_kb])

機能

avi.http.get_req_body([size_in_kb])

説明

クライアント要求本文を返します。要求本文内にデータが存在しない場合(たとえば、要求が POST でない場合)、関数は nil を返します。

注:
  1. request_body_buffering を有効にします([DDoS] タブの [アプリケーション プロファイル] から、または VMware NSX Advanced Load Balancer CLI から)。

  2. バッファ サイズは client_max_body_size で指定しますが、最大 32 MB に制限されます。

  3. client_max_body_size のデフォルトは 0 で、制限なしと解釈されますが、32 MB に制限されます。

  4. client_max_body_size に設定するには、CLI コマンド http_profile を使用します。

イベント

HTTP_REQ_DATA

パラメータ

size_in_kb:返される最大ペイロードをキロバイト単位で示すオプションのパラメータ。

指定しない場合は、要求ペイロード全体が返されます。

注:

仮想サービスで受け入れられる最大ペイロード サイズは、HTTP プロファイルの [DDoS] 設定によって制限できます。

戻り値

データが存在する場合、変数に格納されているデータを返し、それ以外の場合は nil を返します。

HTTP_REQ_DATA イベント:

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 ログ:[string "vs-1"]:2: 1Vt-RoC2-m5O6

2. 要求 ID をヘッダーに追加します。

id=avi.http.get_request_id() avi.http.add_header("Request ID", id)

要求の送信後、要求 ID はヘッダーに含まれます。

Request ID: gQJ-0MYI-YZi6

注:

この API は、イベント SSL_PRECONNECTSSL_CLIENTHELLO、および SSL_HANDSHAKE_DONE ではサポートされていません。

avi.http.get_reqvar()

機能

avi.http.get_reqvar()

説明

avi.http.set_reqvar() 関数を介して、変数に格納されているデータを取得(読み取り)します。これらの変数には、HTTP_REQ イベントと HTTP_RESP イベントの範囲があります。通常、この関数は、HTTP 要求イベントにデータを格納(設定)し、HTTP 応答イベント中に取得する必要がある場合に使用されます。reqvar 関数に保存されるデータの有効期間は、HTTP 要求/応答トランザクションに制限されます。

応答が完了すると、変数は自動的に設定解除されます。すべての Lua 値は、この変数内に格納できます。この変数タイプは、DataScript だけでなく、VMware NSX Advanced Load Balancer 内の他のコンポーネントでも使用できます。VMware NSX Advanced Load Balancer では、3 つのレベルのデータを変数に格納できます。

  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:宣言する変数の名前を指定します。名前は文字列で、引用符で囲む必要があります。

戻り値

データが存在する場合、変数に格納されているデータを返します。  それ以外の場合は nil を返します。

関連

avi.http.set_reqvar()avi.http.set_reqvar 関数から格納された変数を取得します。

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
注:

この API は、イベント SSL_PRECONNECTSSL_CLIENTHELLO、および SSL_HANDSHAKE_DONE ではサポートされていません。

avi.http.get_response_body(size [, offset])

機能

avi.http.get_response_body(size [,offset])

説明

指定したキロバイト オフセットから、バッファされた本文の指定されたキロバイト数を、32,768 KB (32 MB) を超えないように読み取ります。オフセットが指定されていない場合、バッファの先頭から読み取ります。バッファされた本文は、Lua スクリプトによって 1 回だけ処理されます。

イベント

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/path1/path2/index.html?a=b&c=d

イベント

HTTP_REQ

HTTP_RESP

パラメータ

オプションの flagfalse に設定すると、返された URI は解析されません(つまり、URI デコードされません)。

戻り値

URI の文字列値。

要求に組み込まれているレイヤー化された URI の二重エンコード攻撃を確認します。

if string.contains(avi.http.get_uri(), "%") then
  avi.vs.log("Probable Double Encoding attack, conn closed.")
  avi.http.close_conn()
  end 
注:

この API は、イベント SSL_PRECONNECTSSL_CLIENTHELLO、および SSL_HANDSHAKE_DONE ではサポートされていません。

avi.http.get_userid( )

機能

avi.http.get_userid()

説明

接続に関連付けられているユーザー ID を返します。ユーザー ID は、ホワイトまたはブラックリストに対するユーザーの評価など、さまざまな方法で DataScript で使用できます。このフィールドは、検索可能な userid フィールドに入力するために、クライアント ログでも使用されます。このフィールドは次の方法で入力され、この順序で優先されます。

Customuserid は、avi.http.set_userid() コマンドを使用して DataScript によって明示的に設定できます。たとえば、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 フィールドに挿入します。それ以外の場合は、フィールドを none に設定します。

if not avi.http.get_userid() then    avi.http.redirect("http://login.foo.com") end

avi.http.hostname( )

機能

avi.http.hostname()

説明

要求からホスト名を返します。このフィールドは、次の優先順位で次のアイテムから取得されます。

  • 要求行のホスト名。

  • Host 要求ヘッダー フィールドのホスト名。

  • 要求に一致するサーバ名。

注:

フォーム hostname:port の要求行または Host ヘッダーの場合でも、ホスト名にポートは含まれません。

イベント

HTTP_REQ

HTTP_RESP

パラメータ

なし

戻り値

クライアントによって要求されたホスト名の文字列。ポートは含まれません。

例 1

ホスト名がない場合は、TCP 接続を終了します。

host = avi.http.hostname() 
if not host then    
avi.http.close_conn() 
end

例 2

HTTPS への変更中に、相対リダイレクトの location ヘッダーを絶対の値に書き換えます。この DataScript は、HTTP Response イベントに適用する必要があります。

書き換えられたヘッダーは次のようになります: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
この API は、イベント SSL_PRECONNECTSSL_CLIENTHELLO、および SSL_HANDSHAKE_DONE ではサポートされていません。

avi.http.internal_status()

機能

avi.http.internal_status()

説明

バックエンド サーバへの要求が失敗した理由を示す文字列を返します。ユーザーは、これを使用して、さまざまなタイプの障害に対する応答をカスタマイズしたり、理由を VMware NSX Advanced Load Balancer ログに記録したりできます。

イベント

RESP_FAILED

戻り値

失敗の理由

avi.http.method( )

機能

avi.http.method()

説明

GETPOST など、クライアントの要求メソッドを返します。

イベント

HTTP_REQ

HTTP_RESP

パラメータ

なし

戻り値

メソッドの文字列

method = avi.http.method() if method ~= "GET" or method ~= "POST" then    avi.http.response("403") end
注:

この API は、イベント SSL_PRECONNECTSSL_CLIENTHELLO、および SSL_HANDSHAKE_DONE ではサポートされていません。

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
注:

この API は、イベント SSL_PRECONNECT、SSL_CLIENTHELLOSSL_HANDSHAKE_DONE ではサポートされていません。

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 は、次の 2 種類の OAuth トークンのいずれかになります。

  • avi.OAUTH_ACCESS_TOKEN

  • avi.OAUTH_ID_TOKEN

戻り値

トークンが存在する場合、要求されたトークンは文字列として返されます。それ以外の場合は、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 イベントでのみ使用できます。HTTP_RESP イベントでリダイレクトを実行する必要がある場合は、avi.http.response() を使用します。これは、応答を作成するために使用できます。

イベント

HTTP_REQ

パラメータ

uri は、現在の要求をリダイレクトする新しい URI となる文字列です。

オプションの status コードは、リダイレクト状態コードの番号です。状態コード番号または定数文字列のいずれかを使用します。サポートされている状態コードは次のとおりです。

  • 301 avi.HTTP_MOVED_PERMANENTLY

  • 302 avi.HTTP_MOVED_TEMPORARILY

  • 307 avi.HTTP_TEMPORARY_REDIRECT

状態コードが指定されていない場合、デフォルトは 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 が削除されます。

戻り値

なし

要求または応答から 2 つの 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")
この API は、イベント SSL_PRECONNECTSSL_CLIENTHELLO、および SSL_HANDSHAKE_DONE ではサポートされていません。

avi.http.replace_cookie( table )

機能

avi.http.replace_cookie( table )

説明

関数が実行される現在のコンテキストに基づいて、HTTP 要求または応答からの Cookie を置き換えます。指定されたパラメータを使用すると、既存の Cookie 属性を変更できます。指定された Cookie がすでに存在する場合、関数は最初に Cookie の既存のすべてのインスタンスを削除し、指定された値を持つ新しい Cookie を追加します。Cookie がまだ存在しない場合、コマンドの動作は avi.http.add_cookie と同じようになります。

イベント

HTTP_REQ

HTTP_RESP

パラメータ

Cookie の名前と値のペア(HTTP 要求コンテキスト用)と、必要に応じてパス、ドメインなどの他の Cookie 属性値ペア(HTTP 応答用)の table

要求パラメータ

HTTP 要求イベント:Cookie の値は HTTP 要求の Cookie ヘッダーで置き換えられ、そのようなヘッダーが存在しない場合は Cookie ヘッダーが追加されます。

avi.http.replace_cookie( name1, value1 [, name2, value2] )

name は変更する Cookie の名前です。

value は Cookie の新しい値です。

HTTP 要求コンテキストで、すべての引数は Cookie の名前と値のペアとして扱われます。つまり、関数は「ドメイン」、「パス」などの Cookie 属性を無視し、それらを、置き換える別の Cookie として扱います。

応答パラメータ

HTTP 応答イベント:HTTP 応答コンテキストで呼び出されると、HTTP 応答の Set-Cookie ヘッダーで Cookie の値が置き換えられます。そのようなヘッダーが存在しない場合は、Set-Cookie ヘッダーが作成されます。

HTTP 応答コンテキストでは、最初の 2 つの引数のみが Cookie の名前と値のペアとして扱われ、後続の引数は DomainPath などの Cookie 属性とそれに対応する値として解釈されます。

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:jsessionid=123lang=en の 2 つの Cookie の値を置き換えます

cookie_table = {jsessionid="123", lang="en"}
avi.http.replace_cookie( cookie_table )

メソッドの例 2:jsessionid=123 と lang=en の 2 つの Cookie を置き換えます

avi.http.replace_cookie( "jsessionid", "123", "lang", "en" )

HTTP 応答の例

例 1:cookie jsessionid を値 123 と path=/ および domain=www.avinetworks.com の属性に置き換えて、HTTP 応答に次のヘッダーを生成します:

Set-Cookie: jsessionid=123; path=/; domain=www.avinetworks.com

cookie_table = {jsessionid="123", path="/", domain="www.avinetworks.com"} 
avi.http.replace_cookie( cookie_table )

例 2:この形式では、順序が重要です。3 番目の引数はパス、4 番目はドメイン、5 番目は期限切れ、6 番目は最大値、7 番目は httponly フラグ、8 番目は 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
注:

この API は、イベント SSL_PRECONNECTSSL_CLIENTHELLO、および SSL_HANDSHAKE_DONE ではサポートされていません。

avi.http.response( status, [headers, [body]] )

機能

avi.http.response (status, {headers}, body)

説明

カスタム HTTP 応答を使用して HTTP 要求に応答します。

イベント

HTTP_REQ

HTTP_RESP

LB_DONE

パラメータ

status は、HTTP 状態コードを指定するために使用されます。サポートされている状態コードについては、以下のリストを参照してください。

応答にヘッダーを追加するテーブルを指定するには、オプションの headers を使用します。

使用されるデフォルトのコンテンツ タイプは「text/plain」です。したがって、本文が「text/html」などの他の MIME タイプの場合は、ヘッダー パラメータを使用して対応するコンテンツ タイプを指定する必要があります。

オプションの body フラグは、カスタム HTTP 応答本文を指定するために使用される文字列です。

返されたページにグラフィックを挿入する方法については、「DataScript からイメージを返す」を参照してください。

サポートされる状態コード

  • 200 - HTTP OK

  • 301 - Moved Permanently

  • 302 - Found

  • 303 - See other

  • 307 - Temporary redirect。

  • 400 - Bad request

  • 401 - Unauthorized

  • 403 - Forbidden

  • 404 - Not found

  • 405 - Method not allowed

  • 413 - Request entity to large

  • 414 - Request URI too long

  • 429 - Too many requests

  • 451 - Unavailable for legal reasons。

  • 501 - Not mplemented

  • 503 - Service unavailable

戻り値

戻り値はありません。

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 モードで動作する場合は文字列「on」、false の場合は空の文字列を返します。

イベント

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/path1/path2/index.html? a=b&c=d

イベント

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&c=d

この例の a=b で、a は引数で、b は値です。

イベント

HTTP_REQ

パラメータ

新しいクエリには、integerstring、または table があります。入力が文字列の場合、先頭は「?」で区切った単語で構成する必要があります。入力がテーブルの場合、クエリ文字列はキーを引数として扱い、値を対応する引数の値として扱うことで形成されます。

戻り値

値は返されません。

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 要求イベントから任意のデータを変数に設定(書き込み)します。これらの変数には、HTTP_REQ イベントと HTTP_RESP イベントの範囲があります。有効期間は HTTP 要求/応答トランザクションに制限されるため、手動で設定を解除する必要はありません。すべての Lua 値は、この変数内に格納できます。この変数タイプは、DataScript だけでなく、VMware NSX Advanced Load Balancer 内の他のコンポーネントでも使用できます。VMware NSX Advanced Load Balancer では、3 つのレベルのデータを変数に格納できます。

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 関数から取得します。

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
注:

この API は、イベント SSL_PRECONNECTSSL_CLIENTHELLO、および SSL_HANDSHAKE_DONE ではサポートされていません。

avi.http.set_response_body_buffer_size(size)

機能

avi.http.set_response_body_buffer_size( size )

説明

バッファする最大応答本文を設定します。

イベント

HTTP_RESP

パラメータ

size は、バッファするキロバイト数です。範囲は 1 ~ 32,768 KB (32 GB) です。

メモリ割り当てに関する注意事項:

バックエンド サーバからの応答の場合、VMware NSX Advanced Load Balancer は最初に 4 KB を割り当て、それより大きい応答に対しては、割り当てが次のように 48 KB のチャンクで行われます。ここで、ACRB は応答本文の実際の長さです。

  • ACRB < 4 KB の場合、4 KB が割り当てられます。

  • ACRB < avi.http.set_response_body_buffer_size() の場合、4 KB + 48 KB * ((ACRB / 48 KB) +1) が割り当てられます。

  • ACRB > avi.http.set_response_body_buffer_size() の場合、4 KB + 48 KB * ((avi.http.set_response_body_buffer_size()/48 KB +1) が割り当てられます。

戻り値

なし

関連

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 はサーバの応答を 1 時間許可しますが、通常、クライアントはこの時間枠の前でも接続を終了します。このタイムアウト関数は、成功したかどうかにかかわらず、高速応答が必要な高速取引アプリケーションに役立ちます。

デフォルトでは、VMware NSX Advanced Load Balancer はサーバ タイムアウト時に 504(ゲートウェイ タイムアウト)エラーを送信します。VMware NSX Advanced Load Balancer が送信するエラー メッセージを変更するには、HTTP_RESP_FAILED イベントにコードを追加します。次の例を参照してください。

この関数で指定されたタイムアウト値は、2 つの方法で適用されます。まず、サーバ 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
注:

この API は、イベント SSL_PRECONNECTSSL_CLIENTHELLO、および SSL_HANDSHAKE_DONE ではサポートされていません。

avi.http.set_uri( new_uri )

機能

avi.http.set_uri( new_uri )

説明

要求がサーバに送信される前に、現在の HTTP 要求の URI を new_uri に書き換えます。このアクションはリダイレクトとは対照的にクライアントに対して透過的であり、クライアントは強制的に新しい要求を送信し、往復時間コストが発生します。

要求の強調表示された部分が URI に含まれます。

http://www.avinetworks.com/path1/path2/index.html?a=b&c=d

イベント

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 属性がすでに既存の Cookie に存在する場合、この関数は上記の Cookie 属性を attribute_value に変更します。

  • Cookie 属性が存在しない場合、関数は指定された Cookie 属性を Cookie に追加します。

Cookie が存在しない場合は、何も行いません。

イベント

HTTP_RESP。

パラメータ

name:変更する Cookie の名前。

attr:変更/追加が必要な Cookie (name) の属性。

attr_val:既存の Cookie 属性値に置き換える値。

属性:

path は、path 属性の値(文字列)です。

domain は、domain 属性の値(文字列)です。

expires は、expires 属性の値(整数)です。

maxage は、maxage 属性の値(整数)です。

httponly は、httponly 属性の値(ブール値)です。

secure は、secure 属性の値(ブール値)です。

samesite は、同じサイト属性の同じサイト属性値 (avi.http.Lax avi.http.None avi.http.Strict) の値(整数)です。

戻り値

なし。

例 1 - 単一の Set-Cookie 属性の変更:

名前が「name1」でパスが「/dummy」の単純な Cookie を送信するサーバの例:

server cookie example :  Set-Cookie: name1=value1; path=/dummy

サーバの Cookie のパスを /dummy1 DataScript に変更してパス属性を変更する場合:

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 を「www.avinetworks2.com」、HttpOnly に更新する場合は、パスを「/dummy2」に変更し、有効期限を次の 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 には属性の順序がありません。

  • Max-Age Cookie 属性は、avi.http.update_cookie() を使用して変更または更新できます。

  • avi.http.update_cookie() API を使用して、個々の属性または複数の属性を既存の Cookie に追加できます。

  • avi.http.update_cookie() が同じ Cookie 名に対して複数回呼び出されると、同じ Cookie 名に対して複数の Set-Cookie ヘッダーが作成される可能性があります。したがって、同じ Cookie に複数の属性を指定する必要がある場合は、API を使用して、上記のように 1 回の呼び出しで複数の属性を更新します。

  • 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