Citrix ADC

Zusammengesetzte erweiterte Richtlinienausdrücke

Sie können einen erweiterten Richtlinienausdruck konfigurieren, der boolesche oder arithmetische Operatoren und mehrere atomare Operationen enthält. Der folgende zusammengesetzte Ausdruck enthält einen booleschen AND:

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 enthalten. Der folgende Ausdruck wertet die Länge einer HTTP-Anforderung auf der Grundlage ihrer URL und des Cookies aus, wertet Text im Header aus und führt ein boolesches AND 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.

Booleans in zusammengesetzten Ausdrücken

Sie konfigurieren zusammengesetzte Ausdrücke mit den folgenden Operatoren:

  • &&.

    Dieser Operator ist ein logisches AND. Damit der Ausdruck als TRUE ausgewertet werden kann, müssen alle Komponenten, die durch das And verbunden sind, mit TRUE ausgewertet werden. Es folgt ein Beispiel:

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

  • ||.

    Dieser Operator ist ein logisches ODER. Wenn eine Komponente des Ausdrucks, die durch das OR verbunden ist, als TRUE ausgewertet wird, ist der gesamte Ausdruck TRUE.

  • !.

    Führt ein logisches NOT für den Ausdruck aus.

In einigen Fällen bietet das Citrix ADC Konfigurationsdienstprogramm AND, NOT und OR Operatoren im Dialogfeld Ausdruck hinzufügen. Diese sind jedoch von begrenztem Nutzen. Citrix empfiehlt die Verwendung der Operatoren &&, || und!, um zusammengesetzte Ausdrücke zu konfigurieren, 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 Beispiel 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.

Vorgänge, die einen Zeichenfolgenwert erzeugen Beschreibung
str + str Verkettet den Wert des Ausdrucks links vom Operator mit dem Wert auf der rechten Seite. Es folgt ein 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. Es folgt ein 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. Es folgt ein 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. Es folgt ein Beispiel: http.req.hostname + 10.00.000.00
ip + str Verkettet den IP-Adresswert des Ausdrucks auf der linken Seite des Operators mit einem Zeichenfolgenwert auf der rechten Seite. Im Anschluss ist ein Beispiel: client.ip.dst + http.req.url.hostname
str1 ALT str2 Verwendet den Wert string1 oder string2, der vom Ausdruck auf beiden Seiten des Operators abgeleitet wird, solange keiner dieser Ausdrücke zusammengesetzte Ausdrücke ist. Es folgt ein Beispiel: http.req.hostname alt client.ip.src
Operationen an Zeichenfolgen, die ein Ergebnis von TRUE oder FALSE erzeugen Beschreibung
str == str Prüft, ob die Zeichenfolgen auf beiden Seiten des Operators identisch sind. Es folgt ein Beispiel: http.req.header (myheader) == http.res.header (myheader)
str <= str Prüft, ob die Zeichenfolge auf der linken Seite des Operators mit der Zeichenfolge auf der rechten oder alphabetisch vorangestellt ist.
str >= str Prüft, ob die Zeichenfolge auf der linken Seite des Operators mit der Zeichenfolge auf der rechten Seite übereinstimmt oder alphabetisch folgt.
str < str Prüft, ob die Zeichenfolge auf der linken Seite des Operators der Zeichenfolge auf der rechten Seite alphabetisch vorausgeht.
str > str Prüft, ob die Zeichenfolge auf der linken Seite des Operators der Zeichenfolge rechts alphabetisch folgt.
str!! = str Prüft, ob die Strings 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, mit 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 beim Auswerten der Komponenten des zusammengesetzten Ausdrucks eine Komponente des Ausdrucks, der durch das OR verbunden ist, als TRUE ausgewertet wird, ist der gesamte Ausdruck TRUE. 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 Fügen Sie den Wert des Ausdrucks links vom Operator zum Wert des Ausdrucks auf der rechten Seite hinzu. Es folgt ein Beispiel: http.req.content_length + http.req.url.length
num — num Subtrahieren Sie den Wert des Ausdrucks auf der rechten Seite des Operators 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.
Anzahl% 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. Beispielsweise sind die Werte 15 mod 4” gleich 3 und 12 mod 4” gleich 0.
~Zahl Gibt eine Zahl zurück, nachdem eine bitweise logische Negation der Zahl angewendet wurde. Im folgenden Beispiel wird davon ausgegangen, 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.
Zahl ^ Zahl Vergleicht zwei Bitmuster gleicher Länge und führt eine XOR-Operation für jedes Paar der entsprechenden Bits in jedem Zahlenargument durch, wobei 1 zurückgegeben wird, wenn die Bits unterschiedlich sind, und 0, wenn sie identisch sind. Gibt eine Zahl zurück, nachdem ein bitweises XOR auf das ganzzahlige Argument und den aktuellen Zahlenwert angewendet wurde. Wenn die Werte im bitweisen Vergleich identisch sind, ist der zurückgegebene Wert 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.
Anzahl | Anzahl Gibt eine Zahl nach dem Anwenden eines bitweisen ODER auf die Zahlenwerte zurück. Wenn einer der Werte im bitweisen Vergleich eine 1 ist, ist der zurückgegebene Wert ein 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.
Nummer & Nummer Vergleicht zwei Bitmuster gleicher Länge und führt eine bitweise AND-Operation für jedes Paar entsprechender Bits durch, wobei 1 zurückgegeben wird, wenn beide Bits den Wert 1 enthalten, und 0, wenn beide Bits 0 sind. 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 geschlagenen Bits Integer modulo 32 ist. Im folgenden Beispiel wird davon ausgegangen, dass numeric.expression1 12 (binär 1100) zurückgibt und numeric.expression2 3 zurückgibt: numeric.expression1 « numeric.expression2 Das Ergebnis der Anwendung des LSHIFT-Operators ist 96 (binär 1100000) .Beachten Sie, dass alle zurückgegebenen Werte von weniger als 32 Bit vor dem Anwenden des Operators implizit haben 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 geschlagenen 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.
- Nein! = Zahl Bestimmen Sie, ob der Wert des Ausdrucks links vom Operator nicht gleich dem Wert des Ausdrucks auf der rechten Seite ist.
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 auf der linken Seite des Operators 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:

  • Ganzzahl (32 Bit)
  • Langes Vorzeichen (64 Bit)
  • Doppel (64 Bit)

Einfache Ausdrücke können alle diese Datentypen zurückgeben. Daher können Sie zusammengesetzte Ausdrücke erstellen, die arithmetische Operatoren und logische Operatoren verwenden, um Werte dieser Datentypen auszuwerten oder zurückzugeben. Darüber hinaus können Sie alle diese Werte 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 Typerhöhung

In zusammengesetzten Ausdrücken können die folgenden standardmäßigen arithmetischen und logischen Operatoren für die langen Datentypen double und unsigned signed 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 wird die Typerhöhung durchgeführt, sodass die Operation auf Operanden desselben Typs ausgeführt werden kann. Ein Typ mit niedrigerer Priorität wird automatisch auf den Typ des Operanden heraufgestuft, der die höchste Priorität hat, die an der Operation beteiligt ist. Die Rangfolge (höher nach niedriger) lautet wie folgt:

  • Doppelt
  • Nicht signiert lang
  • Ganzzahl

Daher gibt eine Operation, die ein numerisches Ergebnis zurückgibt, ein Ergebnis des höchsten Typs, 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 wird auch in einfachen Ausdrücken durchgeführt, bei denen der vom Ausdruckspräfix identifizierte Datentyp nicht mit dem Datentyp übereinstimmt, der als Argument an die Funktion übergeben wird. Um ein solches Beispiel zu veranschaulichen, wird in der Operation HTTP.REQ.CONTENT_LENGTH.DIV (3ul) die Ganzzahl, die vom Präfix HTTP.REQ.CONTENT_LENGTH zurückgegeben wird, automatisch in Long ohne Vorzeichen konvertiert (der Typ der Daten, die als Argument an die DIV () -Funktion übergeben werden), und eine lange Division ohne Vorzeichen ausgeführt. Ebenso kann das Argument in einem Ausdruck heraufgestuft werden. Beispielsweise 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.

Hinweise zu Ausdrücken zum Umwandeln von Daten eines Typs in Daten eines anderen Typs finden Sie unterTypumwandlung von Daten.

Zusammengesetzte erweiterte Richtlinienausdrücke