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.