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.
Booleans 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 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. 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 | 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 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. (“Inhaltstyp”). Enthält (“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 linken Ausdruckswert des Operators zum rechten Ausdruckswert hinzu. Beispiel: http.req.content_length + http.req.url.length | |
num — num | Subtrahieren Sie den rechten Ausdruckswert des Operators vom linken Ausdruckswert. | |
num x num | Multiplizieren Sie den linken Ausdruckswert des Operators mit dem rechten Ausdruckswert. Beispiel: client.interface.rxthroughput * 9 | |
num/num | Teilen Sie den linken Ausdruckswert des Operators durch den rechten Ausdruckswert. | |
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. Zum Beispiel 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). Alle zurückgegebenen Werte von weniger als 32 Bit vor der Anwendung des Operators haben implizit Nullen auf der linken Seite, 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). Alle zurückgegebenen Werte von weniger als 32 Bit vor der Anwendung des Operators haben implizit Nullen auf der linken Seite, 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). Alle zurückgegebenen Werte von weniger als 32 Bit vor der Anwendung des Operators haben implizit Nullen auf der linken Seite, um sie 32 Bit breit zu machen. |
Nummer & Nummer | 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 den Wert 1 enthalten, und 0, wenn eine der 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. Alle zurückgegebenen Werte von weniger als 32 Bit vor der Anwendung des Operators haben implizit Nullen auf der linken Seite, 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. Die Anzahl der verschobenen Bits ist Integer Modulo 32. 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 (ein binäres 1100000). Alle zurückgegebenen Werte von weniger als 32 Bit vor der Anwendung 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. Die Anzahl der verschobenen Bits ist Integer Modulo 32. 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). Alle zurückgegebenen Werte von weniger als 32 Bit vor der Anwendung des Operators haben implizit Nullen auf der linken Seite, 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:
- Ganzzahl (32 Bit)
- Langes Vorzeichen (64 Bit)
- Doppel (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 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. 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:
- Doppelt
- Nicht signiert lang
- 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.