Aller au contenu

var: Attribution dynamique de variables via des fonctions prédéfinies

Installation

Vous pouvez installer ce module dans n'importe quelle distribution basée sur RHEL, y compris, mais sans s'y limiter :

  • RedHat Enterprise Linux 7, 8, 9 et 10
  • CentOS 7, 8, 9
  • AlmaLinux 8, 9
  • Rocky Linux 8, 9
  • Amazon Linux 2 et 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

Activez le module en ajoutant ce qui suit en haut de /etc/nginx/nginx.conf :

load_module modules/ngx_http_var_module.so;

Ce document décrit nginx-module-var v0.1.3 publié le 02 avril 2026.


server {
    listen 127.0.0.1:8080;
    server_name localhost;

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

Directives

var

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

Par défaut : -

Contexte : http, server, location

Définit une nouvelle variable dont la valeur est le résultat du calcul de la fonction. La valeur de la variable ne peut pas être mise en cache et est recalculée chaque fois qu'elle est utilisée.

Si le niveau actuel ne définit pas une variable avec le même nom, elle peut être héritée du niveau précédent.

Le paramètre -i est utilisé pour ignorer la casse (disponible uniquement dans certaines fonctions).

À l'exception du nom de la fonction, du paramètre -i et de l'expression régulière, tous les paramètres peuvent contenir des variables.

Lorsque la valeur d'un paramètre est invalide, la valeur de la variable est vide. Dans les fonctions booléennes, des paramètres invalides entraîneront également une valeur vide au lieu de 0.

var ne peut pas être utilisé pour définir la même variable simultanément avec les directives map ou geo. Cependant, la directive set peut être utilisée pour remplacer les variables définies par var.

Les fonctions suivantes sont disponibles :

#### Jugement conditionnel ####
# Retourne 1 si le paramètre d'entrée est vide ou 0, sinon retourne 0
var $bool_var not str;

# Retourne 1 si tous les paramètres d'entrée ne sont pas vides et ne sont pas 0, sinon retourne 0
var $bool_var and str1 str2...; 

# Retourne 1 si au moins un paramètre d'entrée n'est pas vide et n'est pas 0, sinon retourne 0
var $bool_var or str1 str2...; 


#### Jugement de chaîne ####
# Vérifie si la chaîne est vide, retourne 1 ou 0
var $bool_var is_empty str;

# Vérifie si la chaîne n'est pas vide, retourne 1 ou 0
var $bool_var is_not_empty str;

# Vérifie si la chaîne est un nombre, retourne 1 ou 0. Seuls les nombres décimaux sont autorisés. Les nombres négatifs et les fractions sont pris en charge.
var $bool_var is_num str;

# Vérifie si les chaînes sont égales, retourne 1 ou 0
var $bool_var str_eq [-i] str1 str2;

# Vérifie si les chaînes ne sont pas égales, retourne 1 ou 0
var $bool_var str_ne [-i] str1 str2;

# Vérifie si la chaîne a le préfixe spécifié, retourne 1 ou 0
var $bool_var starts_with [-i] str prefix;

# Vérifie si la chaîne a le suffixe spécifié, retourne 1 ou 0
var $bool_var ends_with [-i] str suffix;

# Vérifie si la sous-chaîne est présente, retourne 1 ou 0
var $bool_var contains [-i] str sub_str;

# Vérifie si str1 est l'un de str2 .. strn, retourne 1 ou 0
var $bool_var str_in [-i] str1 str2 str3 .. strn;

#### Opérations de chaîne générales ####
# Définit directement la valeur de la variable
var $new_var set src_str;

# Longueur de la chaîne
var $new_var len src_str;

# Convertir en majuscules
var $new_var upper src_str;

# Convertir en minuscules
var $new_var lower src_str;

# Mettre en majuscule la première lettre de chaque mot (les mots sont séparés par des caractères non alphanumériques)
var $new_var initcap src_str;

# Supprimer les espaces ou autres caractères en début et fin
var $new_var trim src_str [char];

# Supprimer les espaces ou autres caractères en début
var $new_var ltrim src_str [char];

# Supprimer les espaces ou autres caractères en fin
var $new_var rtrim src_str [char];

# Inverser la chaîne
var $new_var reverse src_str;

# Obtenir la position de départ de la sous-chaîne
var $new_var position [-i] src_str sub_str;

# Répéter la chaîne un certain nombre de fois
var $new_var repeat src_str times;

# Extraire la sous-chaîne
var $new_var substr src_str start [len];

# Remplacer le mot-clé
var $new_var replace [-i] src_str src dst;

# Extraire des paramètres
# Extraire une valeur d'une liste de paramètres. Un cas d'utilisation pour cela est d'extraire des paramètres de requête sans avoir à écrire une expression régulière, mais cela peut être utilisé pour rechercher des valeurs dans n'importe quelle liste de paires nom/valeur. Si plusieurs occurrences du paramètre existent, seule la première est retournée. la variable obtient une valeur vide. Le délimiteur entre le nom et la valeur d'un paramètre est '=' par défaut, et le séparateur de paramètres est '&' par défaut.
var $new_var extract_param [-i] param_name src_string [separator] [delimiter];

# exemple : une requête "foo=123&bar=456&baz=789". Si le nom du paramètre est bar et que le séparateur est &, alors la valeur de la variable résultante sera 456.
# var $extraed_arg_bar extract_param bar "foo=123&bar=456&baz=789" & =;

#### Opération JSON ####
# Extraire la valeur json d'une chaîne json valide.
# Nécessite que la bibliothèque cJSON soit installée (voir section Installation)
var $new_var extract_json json subkey1 [subkey2] [subkey3] ...;

# Prend en charge les clés d'objet imbriquées et les indices de tableau [n]
# Retourne des valeurs de chaîne sans guillemets, d'autres types sous forme de chaînes JSON
# Les tableaux et les objets sont retournés sous forme de chaînes JSON compactes

# Exemples :
# Extraire d'un objet imbriqué
# var $new_var extract_json '{"a":{"b":{"c":3}}}' a b c;
# Résultat : 3

# Extraire d'un tableau en utilisant [index]
# var $new_var extract_json '{"users":[{"name":"Alice"},{"name":"Bob"}]}' users [0] name;
# Résultat : Alice

# Extraire un tableau sous forme de chaîne JSON
# var $items extract_json '{"data":[1,2,3]}' data;
# Résultat : [1,2,3]

# Extraire un objet sous forme de chaîne JSON
# var $user extract_json '{"user":{"name":"Bob","age":30}}' user;
# Résultat : {"name":"Bob","age":30}


#### Jugement Regex ####
# Vérifier si le regex correspond, retourne 1 ou 0
var $bool_var regex_match [-i] src_str match_regex;


#### Opérations Regex ####
# Capturer regex
var $new_var regex_capture [-i] src_str regex assign_value;

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


#### Jugement mathématique ####
# Vérifier si les nombres sont égaux, retourne 1 ou 0
var $bool_var eq num1 num2;

# Vérifier si les nombres ne sont pas égaux, retourne 1 ou 0
var $bool_var ne num1 num2;

# Vérifier si inférieur, retourne 1 ou 0
var $bool_var lt num1 num2;

# Vérifier si inférieur ou égal, retourne 1 ou 0
var $bool_var le num1 num2;

# Vérifier si supérieur, retourne 1 ou 0
var $bool_var gt num1 num2;

# Vérifier si supérieur ou égal, retourne 1 ou 0
var $bool_var ge num1 num2;

# Vérifier si est dans la plage start_num end_num, si end_num n'est pas spécifié, la plage est [0, start_num], retourne 1 ou 0
var $bool_var range num start_num [end_num];

# Vérifier si le nombre est l'un de num2 .. numn, retourne 1 ou 0
var $bool_var in num1 num2 .. numn;

### Opérations mathématiques ####
# Valeur absolue (retourne le format original sans signe négatif)
var $new_var abs num;

# Valeur maximale (retourne avec le format original)
var $new_var max num1 num2;

# Valeur minimale (retourne avec le format original)
var $new_var min num1 num2;

# Addition entière
var $new_var add int1 int2;

# Soustraction entière
var $new_var sub int1 int2;

# Multiplication entière
var $new_var mul int1 int2;

# Division entière, int2 ne peut pas être 0
var $new_var div int1 int2;

# Modulus entier, int2 ne peut pas être 0
var $new_var mod int1 int2;

# Opération AND bit à bit
var $new_var bitwise_and int1 int2;

# Opération NOT bit à bit
var $new_var bitwise_not int;

# Opération OR bit à bit
var $new_var bitwise_or int1 int2;

# Opération XOR bit à bit (ou exclusif)
var $new_var bitwise_xor int1 int2;

# Opération de décalage à gauche, shift_bits doit être >= 0
var $new_var lshift int shift_bits;

# Opération de décalage à droite (décalage arithmétique, bit de signe préservé), shift_bits doit être >= 0
var $new_var rshift int shift_bits;

# Opération de décalage à droite non signé (décalage logique, remplissage de zéros), shift_bits doit être >= 0
var $new_var urshift int shift_bits;

# Arrondir à n chiffres significatifs
var $new_var round src_num int;

# Tronquer la partie décimale directement (sans arrondi)
var $new_var int src_num;

# Valeur du plancher, le plus grand entier inférieur ou égal à la source
var $new_var floor src_num;

# Valeur du plafond, le plus petit entier supérieur ou égal à la source
var $new_var ceil src_num;

# Entier positif aléatoire, la plage est [start_int, end_int], si end_int n'est pas spécifié, la plage est [0, start_int]
var $new_var rand [start_int] [end_int];

# Séquence hexadécimale aléatoire spécifiée. number_of_bytes doit être 1-32, par défaut 32
var $new_var hexrand [number_of_bytes];


#### Encodage et décodage ####
# Convertir binaire en hexadécimal
var $new_var hex_encode src_str;

# Convertir hexadécimal en binaire
var $new_var hex_decode src_str;

# Décimal en hexadécimal
var $new_var dec_to_hex dec;

# Hexadécimal en décimal
var $new_var hex_to_dec hex;

# Encodage URI complet
var $new_var escape_uri src_str;

# Encodage d'argument
var $new_var escape_args src_str;

# Encodage de composant URI
var $new_var escape_uri_component src_str;

# Encodage HTML
var $new_var escape_html src_str;

# Décodage URI
var $new_var unescape_uri src_str;

# Encodage Base64
var $new_var base64_encode src_str;

# Encodage Base64url
var $new_var base64url_encode src_str;

# Décodage Base64
var $new_var base64_decode src_str;

# Décodage Base64url
var $new_var base64url_decode src_str;


#### Calculs de hachage cryptographique ####
# 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;

# Chiffrement HMAC_MD5
var $new_var hmac_md5 src_str secret;

# Chiffrement HMAC_SHA1
var $new_var hmac_sha1 src_str secret;

# Chiffrement HMAC_SHA224
var $new_var hmac_sha224 src_str secret;

# Chiffrement HMAC_SHA256
var $new_var hmac_sha256 src_str secret;

# Chiffrement HMAC_SHA384
var $new_var hmac_sha384 src_str secret;

# Chiffrement HMAC_SHA512
var $new_var hmac_sha512 src_str secret;

#### Jugement de plage horaire ####
# Détermine si l'heure actuelle respecte la plage horaire donnée, nécessite au moins un paramètre.
# Retourne 1 si toutes les conditions sont remplies, sinon retourne 0.
# Le jour de la semaine est représenté par 0-6, où dimanche est 0, et le format de fuseau horaire est 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];


#### Format horaire ####
# Convertir un timestamp en temps HTTP (temps actuel si le timestamp est omis)
var $new_var gmt_time [src_ts] http_time;

# Convertir un timestamp en temps de cookie (temps actuel si le timestamp est omis)
var $new_var gmt_time [src_ts] cookie_time;

# Convertir un timestamp en temps GMT dans le format spécifié (temps actuel si le timestamp est omis)
var $new_var gmt_time [src_ts] date_format;

# Convertir un timestamp en temps local dans le format spécifié (temps actuel si le timestamp est omis)
var $new_var local_time [src_ts] date_format;

# Retourner le timestamp actuel
var $new_var unix_time;

# Convertir le temps HTTP en timestamp
var $new_var unix_time src_time http_time;

# Convertir une date spécifiée en timestamp (retourne le timestamp actuel si tous sont omis)
var $new_var unix_time src_time date_format [timezone];


#### IP ####
# Détermine si l'adresse ip est dans la plage ip, cidr ou ipv4, si oui, retourne 1, sinon retourne 0
var $bool_var ip_range ip_str [ipv4 | ipv6 | cidr | ipv4_range ] ...;

# Calculer l'adresse réseau basée sur l'adresse IP et les bits de réseau
# Pour IPv4 : la plage de network_bits est 1-32
# Pour IPv6 : la plage de network_bits est 1-128
# Si ipv6_network_bits n'est pas spécifié, il utilisera la même valeur que ipv4_network_bits
# Retourne uniquement l'adresse réseau sans la longueur de préfixe (par exemple, "10.0.0.0" pas "10.0.0.0/8")
var $new_var cidr ipv4/ipv6 ipv4_network_bits [ipv6_network_bits];

Toutes les paramètres sauf les expressions régulières peuvent contenir des variables. Cependant, des valeurs de paramètres incorrectes entraîneront un résultat de calcul de fonction vide.

Les variables définies avec la directive var peuvent être remplacées par des directives telles que set et auth_request_set.

Le paramètre if permet d'activer la variable conditionnelle. var ne sera pas assigné une valeur si la condition évalue à “0” ou une chaîne vide. Et il continuera à chercher des définitions ultérieures de cette variable.

# Lorsque l'en-tête de requête A est présent, la valeur de la variable est 'have-header-a'
var $new_var set have-header-a if=$http_a;

# Lorsque l'en-tête de requête A n'est pas présent mais que l'en-tête de requête B est présent, la valeur de la variable est 'have-header-b'
var $new_var set have-header-b if=$http_b;

# Lorsque les en-têtes de requête A et B ne sont pas présents, la valeur de la variable est 'not-have-a-or-b'
var $new_var set not-have-a-or-b;

GitHub

Vous pouvez trouver des conseils de configuration supplémentaires et de la documentation pour ce module dans le dépôt GitHub pour nginx-module-var.