Zum Inhalt

var: Dynamische Variablenzuweisung durch vordefinierte Funktionen

Installation

Sie können dieses Modul in jeder RHEL-basierten Distribution installieren, einschließlich, aber nicht beschränkt auf:

  • RedHat Enterprise Linux 7, 8, 9 und 10
  • CentOS 7, 8, 9
  • AlmaLinux 8, 9
  • Rocky Linux 8, 9
  • Amazon Linux 2 und Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-var
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-var

Aktivieren Sie das Modul, indem Sie Folgendes an den Anfang von /etc/nginx/nginx.conf hinzufügen:

load_module modules/ngx_http_var_module.so;

Dieses Dokument beschreibt nginx-module-var v0.1.3 veröffentlicht am 02. April 2026.


server {
    listen 127.0.0.1:8080;
    server_name localhost;

    location / {
        var $new_var set $scheme://$host$request_uri;
    }
}

Direktiven

var

Syntax: var $new_variable function [-i] args... [if\=condition]

Standard: -

Kontext: http, server, location

Definieren Sie eine neue Variable, deren Wert das Ergebnis der Funktionsberechnung ist. Der Wert der Variablen kann nicht zwischengespeichert werden und wird jedes Mal neu berechnet, wenn er verwendet wird.

Wenn die aktuelle Ebene keine Variable mit demselben Variablennamen definiert, kann sie von der vorherigen Ebene geerbt werden.

Der Parameter -i wird verwendet, um die Groß- und Kleinschreibung zu ignorieren (verfügbar nur in einigen Funktionen).

Außer dem Funktionsnamen, dem -i-Parameter und dem regulären Ausdruck dürfen alle Parameter Variablen enthalten.

Wenn der Wert eines Parameters ungültig ist, ist der Wert der Variablen leer. In booleschen Funktionen führen ungültige Parameter ebenfalls zu einem leeren Wert anstelle von 0.

var kann nicht verwendet werden, um dieselbe Variable gleichzeitig mit den Direktiven map oder geo zu definieren. Die set-Direktive kann jedoch verwendet werden, um Variablen, die durch var definiert wurden, zu überschreiben.

Die folgenden Funktionen sind verfügbar:

#### Bedingte Beurteilung ####
# Gibt 1 zurück, wenn der Eingabeparameter leer oder 0 ist, andernfalls 0
var $bool_var not str;

# Gibt 1 zurück, wenn alle Eingabeparameter nicht leer und nicht 0 sind, andernfalls 0
var $bool_var and str1 str2...; 

# Gibt 1 zurück, wenn einer der Eingabeparameter nicht leer und nicht 0 ist, andernfalls 0
var $bool_var or str1 str2...; 


#### String-Beurteilung ####
# Überprüft, ob der String leer ist, gibt 1 oder 0 zurück
var $bool_var is_empty str;

# Überprüft, ob der String nicht leer ist, gibt 1 oder 0 zurück
var $bool_var is_not_empty str;

# Überprüft, ob der String eine Zahl ist, gibt 1 oder 0 zurück. Nur Dezimalzahlen sind erlaubt. Negative Zahlen und Brüche werden unterstützt.
var $bool_var is_num str;

# Überprüft, ob die Strings gleich sind, gibt 1 oder 0 zurück
var $bool_var str_eq [-i] str1 str2;

# Überprüft, ob die Strings ungleich sind, gibt 1 oder 0 zurück
var $bool_var str_ne [-i] str1 str2;

# Überprüft, ob der String das angegebene Präfix hat, gibt 1 oder 0 zurück
var $bool_var starts_with [-i] str prefix;

# Überprüft, ob der String das angegebene Suffix hat, gibt 1 oder 0 zurück
var $bool_var ends_with [-i] str suffix;

# Überprüft, ob der Teilstring vorhanden ist, gibt 1 oder 0 zurück
var $bool_var contains [-i] str sub_str;

# Überprüft, ob str1 einer der str2 .. strn ist, gibt 1 oder 0 zurück
var $bool_var str_in [-i] str1 str2 str3 .. strn;

#### Allgemeine String-Operationen ####
# Setzt den Wert der Variablen direkt
var $new_var set src_str;

# Länge des Strings
var $new_var len src_str;

# In Großbuchstaben umwandeln
var $new_var upper src_str;

# In Kleinbuchstaben umwandeln
var $new_var lower src_str;

# Den ersten Buchstaben jedes Wortes großschreiben (Wörter werden durch nicht-alphanumerische Zeichen getrennt)
var $new_var initcap src_str;

# Führende und nachfolgende Leerzeichen oder andere Zeichen trimmen
var $new_var trim src_str [char];

# Führende Leerzeichen oder andere Zeichen trimmen
var $new_var ltrim src_str [char];

# Nachfolgende Leerzeichen oder andere Zeichen trimmen
var $new_var rtrim src_str [char];

# Den String umkehren
var $new_var reverse src_str;

# Startposition des Teilstrings erhalten
var $new_var position [-i] src_str sub_str;

# Den String eine bestimmte Anzahl von Malen wiederholen
var $new_var repeat src_str times;

# Teilstring extrahieren
var $new_var substr src_str start [len];

# Schlüsselwort ersetzen
var $new_var replace [-i] src_str src dst;

# Parameter extrahieren
# Extrahiert einen Wert aus einer Liste von Parametern. Ein Anwendungsfall dafür ist, Abfrageparameter zu extrahieren, ohne einen regulären Ausdruck schreiben zu müssen, aber es kann auch verwendet werden, um Werte in jeder Namen/Wert-Paar-Liste nachzuschlagen. Wenn mehrere Vorkommen des Parameters vorhanden sind, wird nur das erste zurückgegeben. Die Variable erhält einen leeren Wert. Der Trennzeichen zwischen dem Namen und dem Wert eines Parameters ist standardmäßig '=' und der Parametertrennzeichen ist standardmäßig '&'.
var $new_var extract_param [-i] param_name src_string [separator] [delimiter];

# Beispiel: eine Abfrage "foo=123&bar=456&baz=789". Wenn der Parametername bar und der Separator & ist, dann wird der resultierende Variablenwert 456 sein.
# var $extraed_arg_bar extract_param bar "foo=123&bar=456&baz=789" & =;

#### JSON-Operation ####
# Extrahiert den JSON-Wert aus einem gültigen JSON-String.
# Erfordert, dass die cJSON-Bibliothek installiert ist (siehe Installationsabschnitt)
var $new_var extract_json json subkey1 [subkey2] [subkey3] ...;

# Unterstützt verschachtelte Objekt-Schlüssel und Array-Indizes [n]
# Gibt String-Werte ohne Anführungszeichen zurück, andere Typen als JSON-Strings
# Arrays und Objekte werden als kompakte JSON-Strings zurückgegeben

# Beispiele:
# Extrahieren aus einem verschachtelten Objekt
# var $new_var extract_json '{"a":{"b":{"c":3}}}' a b c;
# Ergebnis: 3

# Extrahieren aus einem Array unter Verwendung von [index]
# var $new_var extract_json '{"users":[{"name":"Alice"},{"name":"Bob"}]}' users [0] name;
# Ergebnis: Alice

# Array als JSON-String extrahieren
# var $items extract_json '{"data":[1,2,3]}' data;
# Ergebnis: [1,2,3]

# Objekt als JSON-String extrahieren
# var $user extract_json '{"user":{"name":"Bob","age":30}}' user;
# Ergebnis: {"name":"Bob","age":30}


#### Regex-Beurteilung ####
# Überprüft, ob der Regex übereinstimmt, gibt 1 oder 0 zurück
var $bool_var regex_match [-i] src_str match_regex;


#### Regex-Operationen ####
# Regex erfassen
var $new_var regex_capture [-i] src_str regex assign_value;

# Regex ersetzen
var $new_var regex_sub [-i] src_str regex replacement;


#### Mathematische Beurteilung ####
# Überprüft, ob Zahlen gleich sind, gibt 1 oder 0 zurück
var $bool_var eq num1 num2;

# Überprüft, ob Zahlen ungleich sind, gibt 1 oder 0 zurück
var $bool_var ne num1 num2;

# Überprüft, ob kleiner als, gibt 1 oder 0 zurück
var $bool_var lt num1 num2;

# Überprüft, ob kleiner oder gleich, gibt 1 oder 0 zurück
var $bool_var le num1 num2;

# Überprüft, ob größer als, gibt 1 oder 0 zurück
var $bool_var gt num1 num2;

# Überprüft, ob größer oder gleich, gibt 1 oder 0 zurück
var $bool_var ge num1 num2;

# Überprüft, ob innerhalb des Bereichs start_num end_num, wenn end_num nicht angegeben ist, ist der Bereich [0, start_num], gibt 1 oder 0 zurück
var $bool_var range num start_num [end_num];

# Überprüft, ob die Zahl eine der num2 .. numn ist, gibt 1 oder 0 zurück
var $bool_var in num1 num2 .. numn;

### Mathematische Operationen ####
# Absoluter Wert (gibt das ursprüngliche Format ohne negatives Vorzeichen zurück)
var $new_var abs num;

# Maximalwert (gibt im ursprünglichen Format zurück)
var $new_var max num1 num2;

# Minimalwert (gibt im ursprünglichen Format zurück)
var $new_var min num1 num2;

# Ganzzahladdition
var $new_var add int1 int2;

# Ganzzahlsubtraktion
var $new_var sub int1 int2;

# Ganzzahlmultiplikation
var $new_var mul int1 int2;

# Ganzzahldivision, int2 darf nicht 0 sein
var $new_var div int1 int2;

# Ganzzahlmodulus, int2 darf nicht 0 sein
var $new_var mod int1 int2;

# Bitweise UND-Operation
var $new_var bitwise_and int1 int2;

# Bitweise NICHT-Operation
var $new_var bitwise_not int;

# Bitweise ODER-Operation
var $new_var bitwise_or int1 int2;

# Bitweise XOR-Operation (exklusives ODER)
var $new_var bitwise_xor int1 int2;

# Linksverschiebungsoperation, shift_bits muss >= 0 sein
var $new_var lshift int shift_bits;

# Rechtsverschiebungsoperation (arithmetische Verschiebung, Vorzeichenbit bleibt erhalten), shift_bits muss >= 0 sein
var $new_var rshift int shift_bits;

# Unsigned Rechtsverschiebungsoperation (logische Verschiebung, Nullauffüllung), shift_bits muss >= 0 sein
var $new_var urshift int shift_bits;

# Auf n signifikante Ziffern runden
var $new_var round src_num int;

# Dezimalteil direkt abschneiden (keine Rundung)
var $new_var int src_num;

# Abrunden, die größte ganze Zahl kleiner oder gleich der Quelle
var $new_var floor src_num;

# Aufrunden, die kleinste ganze Zahl größer oder gleich der Quelle
var $new_var ceil src_num;

# Zufällige positive ganze Zahl, der Bereich ist [start_int, end_int], wenn end_int nicht angegeben ist, ist der Bereich [0, start_int]
var $new_var rand [start_int] [end_int];

# Zufällige Hex-Sequenz in angegeben. number_of_bytes muss 1-32 sein, Standard ist 32
var $new_var hexrand [number_of_bytes];


#### Kodierung und Dekodierung ####
# Binär in Hexadezimal umwandeln
var $new_var hex_encode src_str;

# Hexadezimal in Binär umwandeln
var $new_var hex_decode src_str;

# Dezimal in Hexadezimal
var $new_var dec_to_hex dec;

# Hexadezimal in Dezimal
var $new_var hex_to_dec hex;

# Vollständige URI-Kodierung
var $new_var escape_uri src_str;

# Argumentkodierung
var $new_var escape_args src_str;

# URI-Komponenten-Kodierung
var $new_var escape_uri_component src_str;

# HTML-Kodierung
var $new_var escape_html src_str;

# URI-Dekodierung
var $new_var unescape_uri src_str;

# Base64-Kodierung
var $new_var base64_encode src_str;

# Base64url-Kodierung
var $new_var base64url_encode src_str;

# Base64-Dekodierung
var $new_var base64_decode src_str;

# Base64url-Dekodierung
var $new_var base64url_decode src_str;


#### Kryptographische Hash-Berechnungen ####
# CRC32
var $new_var crc32 src_str;

# MD5
var $new_var md5sum src_str;

# SHA1
var $new_var sha1sum src_str;

# SHA224
var $new_var sha224sum src_str;

# SHA256
var $new_var sha256sum src_str;

# SHA384
var $new_var sha384sum src_str;

# SHA512
var $new_var sha512sum src_str;

# HMAC_MD5-Verschlüsselung
var $new_var hmac_md5 src_str secret;

# HMAC_SHA1-Verschlüsselung
var $new_var hmac_sha1 src_str secret;

# HMAC_SHA224-Verschlüsselung
var $new_var hmac_sha224 src_str secret;

# HMAC_SHA256-Verschlüsselung
var $new_var hmac_sha256 src_str secret;

# HMAC_SHA384-Verschlüsselung
var $new_var hmac_sha384 src_str secret;

# HMAC_SHA512-Verschlüsselung
var $new_var hmac_sha512 src_str secret;

#### Zeitbereichsbeurteilung ####
# Bestimmt, ob die aktuelle Zeit den gegebenen Zeitbereich erfüllt, erfordert mindestens einen Parameter.
# Gibt 1 zurück, wenn alle Bedingungen erfüllt sind, andernfalls 0.
# Der Wochentag wird durch 0-6 dargestellt, wobei Sonntag 0 ist, und das Zeitzonenformat ist gmt+0800
var $bool_var time_range [year=year_range] [month=month_range] [day=day_range] [wday=wday_range(0-6)] [hour=hour_range] [min=min_range] [sec=sec_range] [gmt | gmt+0000];


#### Zeitformat ####
# Konvertiert Zeitstempel in HTTP-Zeit (aktuelle Zeit, wenn Zeitstempel weggelassen wird)
var $new_var gmt_time [src_ts] http_time;

# Konvertiert Zeitstempel in Cookie-Zeit (aktuelle Zeit, wenn Zeitstempel weggelassen wird)
var $new_var gmt_time [src_ts] cookie_time;

# Konvertiert Zeitstempel in GMT-Zeit im angegebenen Format (aktuelle Zeit, wenn Zeitstempel weggelassen wird)
var $new_var gmt_time [src_ts] date_format;

# Konvertiert Zeitstempel in lokale Zeit im angegebenen Format (aktuelle Zeit, wenn Zeitstempel weggelassen wird)
var $new_var local_time [src_ts] date_format;

# Gibt aktuellen Zeitstempel zurück
var $new_var unix_time;

# Konvertiert HTTP-Zeit in Zeitstempel
var $new_var unix_time src_time http_time;

# Konvertiert angegebenes Datum in Zeitstempel (gibt aktuellen Zeitstempel zurück, wenn alle weggelassen werden)
var $new_var unix_time src_time date_format [timezone];


#### IP ####
# Bestimmt, ob die IP-Adresse innerhalb des IP-, CIDR- oder IPv4-Bereichs liegt, wenn ja, gibt 1 zurück, andernfalls 0
var $bool_var ip_range ip_str [ipv4 | ipv6 | cidr | ipv4_range ] ...;

# Berechnet die Netzwerkadresse basierend auf der IP-Adresse und den Netzwerkbits
# Für IPv4: Netzwerkbits-Bereich ist 1-32
# Für IPv6: Netzwerkbits-Bereich ist 1-128
# Wenn ipv6_network_bits nicht angegeben ist, wird der gleiche Wert wie ipv4_network_bits verwendet
# Gibt nur die Netzwerkadresse ohne Präfixlänge zurück (z. B. "10.0.0.0" nicht "10.0.0.0/8")
var $new_var cidr ipv4/ipv6 ipv4_network_bits [ipv6_network_bits];

Alle Parameter außer regulären Ausdrücken können Variablen enthalten. Ungültige Parameterwerte führen jedoch dazu, dass das Ergebnis der Funktionsberechnung leer ist.

Variablen, die mit der var-Direktive definiert wurden, können durch Direktiven wie set und auth_request_set überschrieben werden.

Der if-Parameter aktiviert die bedingte Variable. var wird keinen Wert zugewiesen, wenn die Bedingung auf „0“ oder einen leeren String evaluiert wird. Und es wird weiterhin nach nachfolgenden Definitionen dieser Variablen suchen.

# Wenn der Anfrage-Header A vorhanden ist, hat die Variable den Wert 'have-header-a'
var $new_var set have-header-a if=$http_a;

# Wenn der Anfrage-Header A nicht vorhanden ist, aber der Anfrage-Header B vorhanden ist, hat die Variable den Wert 'have-header-b'
var $new_var set have-header-b if=$http_b;

# Wenn sowohl der Anfrage-Header A als auch B nicht vorhanden sind, hat die Variable den Wert 'not-have-a-or-b'
var $new_var set not-have-a-or-b;

GitHub

Sie finden möglicherweise zusätzliche Konfigurationstipps und Dokumentationen für dieses Modul im GitHub-Repository für nginx-module-var.