ADC

複合高度なポリシー式

高度なポリシー式は、ブール演算子または算術演算子とアトミック演算で構成できます。次の複合式には、ブール値 AND があります。

http.req.hostname.eq("mycompany.com") && http.req.method.eq(post)

次の式は、2 つのターゲットの値を加算し、その結果を 3 番目の値と比較します。

http.req.url.length + http.req.cookie.length \<= 500

複合式には、任意の数の論理演算子と算術演算子を使用できます。

次の式は、HTTP リクエストの長さを評価します。この式は URL と Cookie に基づいています。 この式は、ヘッダー内のテキストを評価します。また、この 2 つの結果に対してブール値 AND も表示されます。

http.req.url.length + http.req.cookie.length \<= 500 && http.req.header.contains("some text")

括弧を使用して、複合式での評価の順序を制御できます。

複合式のブール値

複合式は、次の演算子を使用して設定します。

  • &&.

    この演算子は論理 AND です。式を TRUE と評価するには、すべてのコンポーネントが TRUE と評価される必要があります。

    例:

    http.req.url.hostname.eq(“myHost”) && http.req.header(“myHeader”).exists

  • ||.

    この演算子は論理 OR です。式のいずれかのコンポーネントが TRUE と評価された場合、式全体が TRUE になります。

  • !.

    P 式に論理 NOT を指定します。

Citrix ADC構成ユーティリティでは、[ 式の追加 ]ダイアログボックスにAND、NOT、OR演算子が表示されることがあります。ただし、これらの複合式は限定的に使用できます。演算子&&、||、!を使用することをお勧めしますブール論理を使用する複合式を構成するには。

複合式の括弧

括弧を使用して、式の評価順序を制御できます。以下はその例です:

http.req.url.contains("myCompany.com") || (http.req.url.hostname.eq("myHost") && http.req.header("myHeader").exists)

次は別の例です。

(http.req.header("Content-Type").exists && http.req.header("Content-Type").eq("text/html")) || (http.req.header("Transfer-Encoding").exists || http.req.header("Content-Length").exists)

文字列の複合演算

次の表では、文字列データに対して複合演算を設定するために使用できる演算子について説明します。

文字列値を生成する操作 説明
str + str 演算子の左側の式の値と右側の値を連結します。例:http.req.hostname + http.req.url.protocol
str + num 演算子の左側にある式の値と、右側の数値を連結します。例:http.req.hostname + http.req.url.content_length
num + str 演算子の左側にある式の数値を、右側の文字列値と連結します。例:http.req.url.content_length + http.req.url.hostname
str + ip 演算子の左側にある式の文字列値を、右側の IP アドレス値と連結します。例:http.req.hostname + 10.00.000.00
IP + str 演算子の左側にある式の IP アドレス値と右側の文字列値を連結します。例:client.ip.dst + http.req.url.hostname
str1 ALT str2 string1 の評価によって undef 例外が発生するか、結果がヌル文字列である場合は string2 を使用します。それ以外の場合は string1 を使用し、string2 は決して評価しません。例:http.req.hostname alt client.ip.src
TRUE または FALSE の結果を生成する文字列に対する演算 説明
str == str 演算子の両側の文字列が同じかどうかを評価します。以下は例です:http.req.header (「myheader」) == http.res.header (「myheader」)
str <= str 演算子の左側の文字列が右側の文字列と同じか、アルファベット順で先行するかを評価します。
str >= str 演算子の左側の文字列が右側の文字列と同じであるか、アルファベット順に続くかを評価します。
str < str 演算子の左側の文字列が、アルファベット順で右側の文字列より前にあるかどうかを評価します。
str > str 演算子の左側の文字列が、アルファベット順に右側の文字列の後に続くかどうかを評価します。
str !!= str 演算子の両側の文字列が異なるかどうかを評価します。
文字列に対する論理演算 説明
bool && bool この演算子は論理 AND です。複合式のコンポーネントを評価する場合、および、結合されたすべてのコンポーネントが TRUE と評価される必要があります。以下は例である。http.req.method.eq (GET) && http.req.url.query.contains (「viewReport && my_pagelabel」)
bool || bool この演算子は論理 OR です。複合式のコンポーネントを評価するときに、OR に属する式のいずれかのコンポーネントが TRUE と評価されると、式全体が TRUE になります。以下は、例です。http.req.url.contains (「.js」) || http.res.header。(「コンテンツタイプ」)。(「javascript」) を含む
bool 式に対して論理 NOT を実行します。

数値の複合演算

複合数値式を設定できます。たとえば、次の式は、HTTP ヘッダーの長さと URL の長さの合計を表す数値を返します。

http.req.header.length + http.req.url.length

次の表では、数値データの複合式を構成するために使用できる演算子について説明します。

数値の算術演算 説明
num + num 演算子の左側の式の値を、右側の式の値に加算します。以下は例である。http.req.content_length + http.req.url.length
num – num 演算子の右側の式の値を、左側の式の値から減算します。
num*num 演算子の左側の式の値と、右側の式の値を乗算します。次に例を示します。client.interface.rxthroughput* 9
num / num 演算子の左側の式の値を、右側の式の値で割ります。
num % num モジュロ、または演算子の左側の式の値を、右側の式の値で除算した剰余を計算します。たとえば、値「15 mod 4」は 3、「12 mod 4」の値は 0 です。
~number 数値のビット単位の論理否定を適用した後の数値を返します。次の例では、数値.expression が 12 (バイナリ 1100) を返すと仮定しています:~numeric.expression。〜演算子を適用した結果は、-11(バイナリ1110011、合計32ビット、すべてが左側)です。演算子を暗黙的に適用する前の32ビット未満のすべての戻り値は、32ビット幅になるように左にゼロがあることに注意してください。
number ^ number 等しい長さの 2 つのビットパターンを比較し、各 number 引数の対応するビットの各ペアに対して XOR 演算を実行します。ビットが異なる場合は 1 を返し、同じ場合は 0 を返します。整数引数と現在の数値にビット単位の排他的論理和を適用した後の数値を返します。ビット単位の比較の値が同じ場合、戻り値は 0 です。次の例では、数値.式 1 は 12 (バイナリ 1100) を返し、数値.式 2 は 10 (バイナリ 1010) を返します。数値.式1 ^ 数値.式2 ^ 演算子を式全体に適用した結果は 6 (バイナリ 0110) です。演算子を暗黙的に適用する前の32ビット未満のすべての戻り値は、32ビット幅になるように左にゼロがあることに注意してください。
数値| 数値 数値にビット単位の OR を適用した後の数値を返します。ビット単位の比較のいずれかの値が 1 の場合、戻り値は 1 です。次の例では、数値.式 1 が 12 (バイナリ 1100) を返し、数値.式 2 が 10 (バイナリ 1010) を返すと仮定しています。数値.式1 | 数値.式2 | 演算子を式全体に適用した結果は 14 (バイナリ 1110) です。演算子を暗黙的に適用する前の32ビット未満のすべての戻り値は、32ビット幅になるように左にゼロがあることに注意してください。
number & number 等しい長さの 2 つのビットパターンを比較し、対応するビットの各ペアに対してビット単位の AND 演算を実行します。両方のビットに 1 の値が含まれている場合は 1 を返し、いずれかのビットが 0 の場合は 0 を返します。次の例では、数値.式1 が 12 (バイナリ 1100) を返し、数値.式2 は 10 (バイナリ 1010) を返すと仮定しています。数値.式1 と数値.式2 式全体が 8 (バイナリ 1000) と評価されます。演算子を暗黙的に適用する前の32ビット未満のすべての戻り値は、32ビット幅になるように左にゼロがあることに注意してください。
num « num 右側の number 引数のビット数によって、数値値のビット単位の左シフトの後に数値を返します。シフトされるビット数は 32 を法とする整数であることに注意してください。次の例では、numeric.expression1 が 12 (バイナリ 1100) を返し、numeric.expression2 が 3 を返すと仮定しています。numeric.expression1 « numeric.expression2 LSHIFT 演算子を適用した結果は 96 (バイナリ 1100000) になります。演算子を適用する前に、32 ビット未満のすべての値が返されることに注意してください。暗黙的に左にゼロを持たせて、32 ビット幅にします。
num » num 整数引数のビット数による数値値のビット単位の右シフト後の数値を返します。シフトされるビット数は 32 を法とする整数であることに注意してください。次の例では、数値.式1 が 12 (バイナリ 1100) を返し、数値.式2 が 3 を返すと仮定しています。数値.式1 » 数値.式2 RSHIFT 演算子を適用した結果は 1 (バイナリ 0001) です。演算子を暗黙的に適用する前の32ビット未満のすべての戻り値は、32ビット幅になるように左にゼロがあることに注意してください。

| TRUE または FALSE の結果を生成する数値演算子 | 説明 | | ———– | —————————————————————————————————————————————— | | num == num | 演算子の左側の式の値が、右側の式の値と等しいかどうかを判断します。 | | num!= num | 演算子の左側の式の値が右側の式の値と等しくないかどうかを判定します。 | | | num > num | 演算子の左側の式の値が右側の式の値より大きいかどうかを判定する。 | | num < num | 演算子の左側の式の値が右側の式の値より小さいかどうかを判定する。 | | num >= num | 演算子の左側の式の値が右側の式の値以上であるかどうかを判定する。| | num <= num | 演算子の左側の式の値が右側の式の値以下かどうかを判定する |

ポリシーインフラストラクチャのデータ型の関数

Citrix ADCポリシーインフラストラクチャでは、次の数値データ型がサポートされています。

  • 整数 (32 ビット)
  • 符号なしロング (64 ビット)
  • ダブル (64 ビット)

単純な式は、これらのすべてのデータ型を返すことができます。また、算術演算子と論理演算子を使用してこれらのデータ型の値を評価または返す複合式を作成することもできます。また、ポリシー式では、これらの値をすべて使用できます。符号なし long 型のリテラル定数は、文字列 ul を数値に追加することで指定できます。double 型のリテラル定数には、ピリオド (.)、指数、またはその両方が含まれます。

算術演算子、論理演算子、および型推進

複合式では、倍精度浮動小数点型および符号なし長整数型に対して、次の標準的な算術演算子と論理演算子を使用できます。

  • +、-、*、/
  • %, ~, ^, &, |, «, and » (do not apply to double)
  • ==、!=、>、<、>=、<=

これらの演算子はすべて、Cプログラミング言語と同じ意味を持ちます。

整数型、符号なし long、および double 型のオペランド間の混合演算のすべての場合において。型昇格は、同じ型のオペランドに対して操作を行うために行われます。この演算では、優先順位の高いオペランドに下位優先タイプが昇格されます。優先順位の順序(高い順)は次のとおりです。

  • Double
  • 符号なしロング
  • 整数

したがって、数値の結果を返す操作は、操作に含まれる最も高いタイプの結果を返します。

たとえば、オペランドが整数型で符号なし長型の場合、整数オペランドは自動的に符号なし長型に変換されます。この型変換は、単純な式で行われます。式の接頭辞によって識別されるデータの型が、関数に引数として渡されるデータの型と一致しません。HTTP.REQ.CONTENT_LENGTH.DIV (3ul) のオペレーションでは、接頭辞 HTTP.REQ.CONTENT_LENGTH は、符号なしロングになる整数を返します。符号なし長整数型:DIV () 関数の引数として渡されるデータ型で、符号なし長除算が実行されます。同様に、引数は式で昇格することができます。たとえば、HTTP.REQ.HEADER (「myHeader」) .TYPECAST_DOUBLE_AT.DIV (5) は整数 5 を倍精度型に昇格させ、倍精度除算を行います。

ある型のデータを別の型のデータにキャストする式については、 データの型キャストを参照してください

複合高度なポリシー式