Citrix ADC

Zusammengesetzte erweiterte Richtlinienausdrücke

Sie können einen erweiterten Richtlinienausdruck mit booleschen oder arithmetischen Operatoren und atomaren Operationen konfigurieren. Der folgende zusammengesetzte Ausdruck hat ein boolesches UND:

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

Der folgende Ausdruck fügt den Wert zweier Ziele hinzu und vergleicht das Ergebnis mit einem dritten Wert:

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

Ein zusammengesetzter Ausdruck kann eine beliebige Anzahl von logischen und arithmetischen Operatoren haben.

Der folgende Ausdruck wertet die Länge einer HTTP-Anforderung aus. Dieser Ausdruck basiert auf der URL und dem Cookie. Dieser Ausdruck wertet den Text in der Kopfzeile aus. Führt auch ein boolesches UND für diese beiden Ergebnisse aus:

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

Sie können Klammern verwenden, um die Reihenfolge der Auswertung in einem zusammengesetzten Ausdruck zu steuern.

Boolesche Werte in zusammengesetzten Ausdrücken

Sie konfigurieren zusammengesetzte Ausdrücke mit den folgenden Operatoren:

  • &&.

    Dieser Operator ist ein logisches AND. Damit der Ausdruck auf TRUE ausgewertet werden kann, müssen alle Komponenten auf TRUE ausgewertet werden.

    Beispiel:

    http.req.url.hostname.eq (MyHost) && http.req.header (MyHeader) .exists

  • ||.

    Dieser Operator ist ein logisches ODER. Wenn eine Komponente des Ausdrucks zu TRUE ausgewertet wird, ist der gesamte Ausdruck TRUE.

  • !.

    P Ist ein logisches NICHT für den Ausdruck.

Manchmal bietet das Citrix ADC-Konfigurationsdienstprogramm Operatoren UND, NICHT und ODER im Dialogfeld Ausdruck hinzufügen an. Diese zusammengesetzten Ausdrücke sind jedoch von eingeschränktem Nutzen. Citrix empfiehlt die Verwendung der Operatoren &&, || und! So konfigurieren Sie zusammengesetzte Ausdrücke, die Boolesche Logik verwenden.

Klammern in zusammengesetzten Ausdrücken

Sie können Klammern verwenden, um die Reihenfolge der Auswertung eines Ausdrucks zu steuern. Ein Beispiel:

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

Das Folgende ist ein weiteres Beispiel:

(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)

Zusammengesetzte Operationen für Zeichenfolgen

In der folgenden Tabelle werden Operatoren beschrieben, mit denen Sie zusammengesetzte Operationen für Zeichenfolgendaten konfigurieren können.

Operationen, die einen Zeichenfolgenwert erzeugen Beschreibung
str + str Verkettet den Wert des Ausdrucks links vom Operator mit dem Wert auf der rechten Seite. Beispiel: http.req.hostname + http.req.url.protocol
str + num Verkettet den Wert des Ausdrucks links vom Operator mit einem numerischen Wert auf der rechten Seite. Beispiel: http.req.hostname + http.req.url.content_length
num + str Verkettet den numerischen Wert des Ausdrucks auf der linken Seite des Operators mit einem Zeichenfolgenwert auf der rechten Seite. Beispiel: http.req.url.content_length + http.req.url.hostname
str + ip Verkettet den Zeichenfolgenwert des Ausdrucks auf der linken Seite des Operators mit einem IP-Adresswert auf der rechten Seite. Beispiel: http.req.hostname + 10.00.000.00
IP + str Verkettet den IP-Adresswert des Ausdrucks links vom Operator mit einem Zeichenfolgenwert auf der rechten Seite. Beispiel: client.ip.dst + http.req.url.hostname
str1 ALT str2 Verwendet string2, wenn die Auswertung von String1 zu einer undef-Ausnahme führt oder das Ergebnis eine Nullzeichenfolge ist. Ansonsten verwendet string1 und wertet niemals String2 aus. Beispiel: http.req.hostname alt client.ip.src
Operationen an Zeichenfolgen, die ein Ergebnis von TRUE oder FALSE erzeugen Beschreibung
str == str Wertet aus, ob die Zeichenfolgen auf beiden Seiten des Operators identisch sind. Es folgt ein Beispiel: http.req.header(“myheader”) == http.res.header(“myheader”)
str <= str Wertet aus, ob die Zeichenfolge auf der linken Seite des Operators der Zeichenfolge auf der rechten Seite entspricht oder alphabetisch vorangeht.
str >= str Wertet aus, ob die Zeichenfolge auf der linken Seite des Operators der Zeichenfolge auf der rechten Seite entspricht oder ihr alphabetisch folgt.
str < str Wertet aus, ob die Zeichenfolge auf der linken Seite des Operators der Zeichenfolge auf der rechten Seite alphabetisch vorausgeht.
str > str Wertet aus, ob die Zeichenfolge auf der linken Seite des Operators der Zeichenfolge auf der rechten Seite alphabetisch folgt.
str !!= str Wertet aus, ob die Zeichenfolgen auf beiden Seiten des Operators unterschiedlich sind.
Logische Operationen an Strings Beschreibung
bool && bool Dieser Operator ist ein logisches AND. Bei der Auswertung der Komponenten des zusammengesetzten Ausdrucks müssen alle Komponenten, die durch DAS UND verbunden sind, auf TRUE ausgewertet werden. Es folgt ein Beispiel: http.req.method.eq(GET) && http.req.url.query.contains(“viewReport && my_pagelabel”)
bool || bool Dieser Operator ist ein logisches ODER. Wenn bei der Auswertung der Komponenten des zusammengesetzten Ausdrucks eine Komponente des Ausdrucks, der zu OR gehört, mit TRUE ausgewertet wird, ist der gesamte Ausdruck WAHR. Es folgt ein Beispiel: http.req.url.contains(“.js”) || http.res.header.(“Content-Type”). Contains(“javascript”)
bool Führt ein logisches NOT für den Ausdruck aus.

Zusammengesetzte Operationen für Zahlen

Sie können zusammengesetzte numerische Ausdrücke konfigurieren. Der folgende Ausdruck gibt beispielsweise einen numerischen Wert zurück, der die Summe einer HTTP-Headerlänge und einer URL-Länge ist:

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

In den folgenden Tabellen werden Operatoren beschrieben, mit denen Sie zusammengesetzte Ausdrücke für numerische Daten konfigurieren können.

Arithmetische Operationen auf Zahlen Beschreibung
num + num Addieren Sie den Wert des Ausdrucks auf der linken Seite des Operators zum Wert des Ausdrucks auf der rechten Seite. Es folgt ein Beispiel: http.req.content_length + http.req.url.length
num — num Subtrahieren Sie den Wert des Ausdrucks rechts vom Operator vom Wert des Ausdrucks auf der linken Seite.
num*num Multiplizieren Sie den Wert des Ausdrucks links vom Operator mit dem Wert des Ausdrucks auf der rechten Seite. Es folgt ein Beispiel: client.interface.rxthroughput* 9
num / num Teilen Sie den Wert des Ausdrucks links vom Operator durch den Wert des Ausdrucks auf der rechten Seite.
num % num Berechnen Sie den Modulo oder den numerischen Rest einer Division des Wertes des Ausdrucks links vom Operator durch den Wert des Ausdrucks auf der rechten Seite. Zum Beispiel entsprechen die Werte “15 mod 4” 3 und “12 mod 4” gleich 0.
~number Gibt eine Zahl zurück, nachdem eine bitweise logische Negation der Zahl angewendet wurde. Das folgende Beispiel geht davon aus, dass numeric.expression 12 (binär 1100) zurückgibt: ~numeric.expression. Das Ergebnis der Anwendung des Operator ~ ist -11 (ein binärer 1110011, insgesamt 32 Bit mit allen nach links). Beachten Sie, dass alle zurückgegebenen Werte von weniger als 32 Bit vor dem Anwenden des Operators implizit Nullen auf der linken Seite haben, um sie 32 Bit breit zu machen.
number ^ number Vergleicht zwei Bitmuster gleicher Länge und führt eine XOR-Operation für jedes Paar entsprechender Bits in jedem Zahlenargument durch, wobei 1 zurückgegeben wird, wenn die Bits unterschiedlich sind, und 0, wenn sie gleich sind. Gibt eine Zahl zurück, nachdem ein bitweises XOR auf das Integer-Argument und den aktuellen Zahlenwert angewendet wurde. Wenn die Werte im bitweisen Vergleich gleich sind, ist der zurückgegebene Wert eine 0. Im folgenden Beispiel wird davon ausgegangen, dass numeric.expression1 12 (binär 1100) zurückgibt und numeric.expression2 10 (binär 1010) zurückgibt: numeric.expression1 ^ numeric.expression2 Das Ergebnis der Anwendung des Operator ^ auf den gesamten Ausdruck ist 6 (binär 0110). Beachten Sie, dass alle zurückgegebenen Werte von weniger als 32 Bit vor dem Anwenden des Operators implizit Nullen auf der linken Seite haben, um sie 32 Bit breit zu machen.
number | number Gibt eine Zahl zurück, nachdem ein bitweises ODER auf die Zahlenwerte angewendet wurde. Wenn einer der Werte im bitweisen Vergleich eine 1 ist, ist der zurückgegebene Wert eine 1. Im folgenden Beispiel wird davon ausgegangen, dass numeric.expression1 12 (binär 1100) und numeric.expression2 10 (binär 1010) zurückgibt: numeric.expression1 | numeric.expression2 Das Ergebnis der Anwendung des Operator | auf den gesamten Ausdruck ist 14 (binär 1110). Beachten Sie, dass alle zurückgegebenen Werte von weniger als 32 Bit vor dem Anwenden des Operators implizit Nullen auf der linken Seite haben, um sie 32 Bit breit zu machen.
number & number Vergleicht zwei Bitmuster gleicher Länge und führt eine bitweise UND -Operation für jedes Paar entsprechender Bits aus, wobei 1 zurückgegeben wird, wenn beide Bits einen Wert von 1 enthalten, und 0, wenn eines der beiden Bits 0 ist. Im folgenden Beispiel wird davon ausgegangen, dass numeric.expression1 12 (binär 1100) und numeric.expression2 10 (binär 1010) zurückgibt: numeric.expression1 & numeric.expression2 Der gesamte Ausdruck wird als 8 (binär 1000) ausgewertet. Beachten Sie, dass alle zurückgegebenen Werte von weniger als 32 Bit vor dem Anwenden des Operators implizit Nullen auf der linken Seite haben, um sie 32 Bit breit zu machen.
num « num Gibt eine Zahl nach einer bitweisen linken Verschiebung des Zahlenwertes um die rechte Zahl Argument Anzahl der Bits zurück. Beachten Sie, dass die Anzahl der verschobenen Bits Integer Modulo 32 ist. Das folgende Beispiel geht davon aus, dass numeric.expression1 12 (binär 1100) zurückgibt und numerisch.expression2 3 zurückgibt: numerisch.ausdruck1 « numerisch.ausdruck2 Das Ergebnis der Anwendung des LSHIFT-Operators ist 96 (eine binäre 1100000) .Beachten Sie, dass alle zurückgegebenen Werte von weniger als 32 Bit vor dem Anwenden des Operators haben implizit Nullen auf der linken Seite, um sie 32 Bit breit zu machen.
num » num Gibt eine Zahl nach einer bitweisen rechten Verschiebung des Zahlenwertes um die ganzzahlige Argumentanzahl der Bits zurück. Beachten Sie, dass die Anzahl der verschobenen Bits Integer Modulo 32 ist. Im folgenden Beispiel wird davon ausgegangen, dass numeric.expression1 12 (binär 1100) und numeric.expression2 3 zurückgibt: numeric.expression1 » numeric.expression2 Das Ergebnis der Anwendung des RSHIFT-Operators ist 1 (binär 0001). Beachten Sie, dass alle zurückgegebenen Werte von weniger als 32 Bit vor dem Anwenden des Operators implizit Nullen auf der linken Seite haben, um sie 32 Bit breit zu machen.
Numerische Operatoren, die ein Ergebnis von TRUE oder FALSE erzeugen Beschreibung  
num = num Bestimmen Sie, ob der Wert des Ausdrucks links vom Operator dem Wert des Ausdrucks auf der rechten Seite entspricht.  
num! = num Bestimmen Sie, ob der Wert des Ausdrucks links vom Operator nicht dem Wert des Ausdrucks auf der rechten Seite entspricht. |
num > num Bestimmen Sie, ob der Wert des Ausdrucks links vom Operator größer ist als der Wert des Ausdrucks auf der rechten Seite. |  
num < num Bestimmen Sie, ob der Wert des Ausdrucks links vom Operator kleiner ist als der Wert des Ausdrucks auf der rechten Seite. |  
num >= num Bestimmen Sie, ob der Wert des Ausdrucks links vom Operator größer oder gleich dem Wert des Ausdrucks auf der rechten Seite ist. |  
num <= num Bestimmen Sie, ob der Wert des Ausdrucks links vom Operator kleiner oder gleich dem Wert des Ausdrucks auf der rechten Seite ist |  

Funktionen für Datentypen in der Richtlinieninfrastruktur

Die Citrix ADC-Richtlinieninfrastruktur unterstützt die folgenden numerischen Datentypen:

  • Integer (32 Bit)
  • Vorzeichenlos lang (64 Bit)
  • Doppelt (64 Bit)

Einfache Ausdrücke können alle diese Datentypen zurückgeben. Sie können auch zusammengesetzte Ausdrücke erstellen, die arithmetische Operatoren und logische Operatoren verwenden, um die Werte dieser Datentypen auszuwerten oder zurückzugeben. Sie können alle diese Werte auch in Richtlinienausdrücken verwenden. Literal Konstanten vom Typ unsigned long können durch Anhängen der Zeichenfolge ul an die Zahl angegeben werden. Literale Konstanten vom Typ double enthalten einen Punkt (.), einen Exponenten oder beides.

Arithmetische Operatoren, logische Operatoren und Typförderung

In zusammengesetzten Ausdrücken können die folgenden standardmäßigen arithmetischen und logischen Operatoren für die doppelten und vorzeichenlosen langen Datentypen verwendet werden:

  • +, -, * und/
  • %, ~, ^, &, |, «, and » (gelten nicht für Double)
  • ==,! =, >, <, >= und <=

Alle diese Operatoren haben die gleiche Bedeutung wie in der Programmiersprache C.

In allen Fällen von gemischten Operationen zwischen Operanden vom Typ integer, unsigned long und double. Die Typenförderung wird durchgeführt, um die Operation an den Operanden desselben Typs durchzuführen. Die Operation fördert einen Typ mit niedrigerer Rangfolge für den Operanden mit der höchsten Rangfolge. Die Rangfolge (höher nach niedriger) lautet wie folgt:

  • Double
  • Unsigned long
  • Ganzzahl

Eine Operation, die ein numerisches Ergebnis zurückgibt, gibt also ein Ergebnis des höchsten Typs zurück, der an der Operation beteiligt ist.

Beispiel: Wenn die Operanden vom Typ Integer und Long ohne Vorzeichen sind, wird der Integer-Operand automatisch in den Typ unsigned long konvertiert. Diese Typkonvertierung erfolgt in einfachen Ausdrücken. Der durch das Ausdruckspräfix identifizierte Datentyp stimmt nicht mit dem Datentyp überein, der als Argument an die Funktion übergeben wird. In der Operation HTTP.REQ.CONTENT_LENGTH.DIV(3ul) gibt das Präfix HTTP.REQ.CONTENT_LENGTH eine Ganzzahl zurück, die zu einem Long ohne Vorzeichen wird. Unsigned long: Der Datentyp, der als Argument an die DIV () -Funktion übergeben wird, wird eine lange Division ohne Vorzeichen ausgeführt. Ebenso kann das Argument in einem Ausdruck heraufgestuft werden. Zum Beispiel fördert HTTP.REQ.HEADER(“myHeader”).TYPECAST_DOUBLE_AT.DIV(5) die ganze Zahl 5 zur Eingabe von Double und führt eine Division mit doppelter Genauigkeit durch.

Informationen zu Ausdrücken zum Umwandeln von Daten eines Typs in Daten eines anderen Typs finden Sie unter Typecasting von Daten.

Zusammengesetzte erweiterte Richtlinienausdrücke