var: Asignación dinámica de variables a través de funciones predefinidas
Instalación
Puedes instalar este módulo en cualquier distribución basada en RHEL, incluyendo, pero no limitado a:
- RedHat Enterprise Linux 7, 8, 9 y 10
- CentOS 7, 8, 9
- AlmaLinux 8, 9
- Rocky Linux 8, 9
- Amazon Linux 2 y 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
Habilita el módulo añadiendo lo siguiente en la parte superior de /etc/nginx/nginx.conf:
load_module modules/ngx_http_var_module.so;
Este documento describe nginx-module-var v0.1.3 lanzado el 02 de abril de 2026.
server {
listen 127.0.0.1:8080;
server_name localhost;
location / {
var $new_var set $scheme://$host$request_uri;
}
}
Directivas
var
Sintaxis: var $new_variable function [-i] args... [if\=condition]
Por defecto: -
Contexto: http, server, location
Define una nueva variable cuyo valor es el resultado del cálculo de la función. El valor de la variable no puede ser almacenado en caché y se recalcula cada vez que se utiliza.
Si el nivel actual no define una variable con el mismo nombre, puede heredarse del nivel anterior.
El parámetro -i se utiliza para ignorar mayúsculas y minúsculas (disponible solo en algunas funciones).
Excepto por el nombre de la función, el parámetro -i y la expresión regular, se permite que todos los parámetros contengan variables.
Cuando el valor de un parámetro es inválido, el valor de la variable es vacío. En funciones booleanas, los parámetros inválidos también resultarán en un valor vacío en lugar de 0.
var no puede ser utilizado para definir la misma variable simultáneamente con las directivas map o geo. Sin embargo, la directiva set puede ser utilizada para sobrescribir variables definidas por var.
Las siguientes funciones están disponibles:
#### Juicio Condicional ####
# Devuelve 1 si el parámetro de entrada está vacío o es 0, de lo contrario devuelve 0
var $bool_var not str;
# Devuelve 1 si todos los parámetros de entrada no están vacíos y no son 0, de lo contrario devuelve 0
var $bool_var and str1 str2...;
# Devuelve 1 si alguno de los parámetros de entrada no está vacío y no es 0, de lo contrario devuelve 0
var $bool_var or str1 str2...;
#### Juicio de Cadenas ####
# Verifica si la cadena está vacía, devuelve 1 o 0
var $bool_var is_empty str;
# Verifica si la cadena no está vacía, devuelve 1 o 0
var $bool_var is_not_empty str;
# Verifica si la cadena es un número, devuelve 1 o 0. Solo se permiten números decimales. se admiten números negativos y fracciones.
var $bool_var is_num str;
# Verifica si las cadenas son iguales, devuelve 1 o 0
var $bool_var str_eq [-i] str1 str2;
# Verifica si las cadenas no son iguales, devuelve 1 o 0
var $bool_var str_ne [-i] str1 str2;
# Verifica si la cadena tiene el prefijo especificado, devuelve 1 o 0
var $bool_var starts_with [-i] str prefix;
# Verifica si la cadena tiene el sufijo especificado, devuelve 1 o 0
var $bool_var ends_with [-i] str suffix;
# Verifica si la subcadena está presente, devuelve 1 o 0
var $bool_var contains [-i] str sub_str;
# Verifica si str1 es uno de str2 .. strn, devuelve 1 o 0
var $bool_var str_in [-i] str1 str2 str3 .. strn;
#### Operaciones Generales de Cadenas ####
# Establece el valor directamente de la variable
var $new_var set src_str;
# Longitud de la cadena
var $new_var len src_str;
# Convierte a mayúsculas
var $new_var upper src_str;
# Convierte a minúsculas
var $new_var lower src_str;
# Capitaliza la primera letra de cada palabra (las palabras están separadas por caracteres no alfanuméricos)
var $new_var initcap src_str;
# Recorta los caracteres de espacio en blanco al principio y al final o otros caracteres
var $new_var trim src_str [char];
# Recorta los caracteres de espacio en blanco al principio o otros caracteres
var $new_var ltrim src_str [char];
# Recorta los caracteres de espacio en blanco al final o otros caracteres
var $new_var rtrim src_str [char];
# Invierte la cadena
var $new_var reverse src_str;
# Obtiene la posición inicial de la subcadena
var $new_var position [-i] src_str sub_str;
# Repite la cadena un número dado de veces
var $new_var repeat src_str times;
# Extrae subcadena
var $new_var substr src_str start [len];
# Reemplaza palabra clave
var $new_var replace [-i] src_str src dst;
# Extraer parámetros
# Extrae un valor de una lista de parámetros. Un caso de uso para esto es extraer parámetros de consulta sin tener que escribir una expresión regular, pero se puede usar para buscar valores en cualquier lista de pares nombre/valor. Si existen varias ocurrencias del parámetro, solo se devuelve la primera. la variable obtiene un valor en blanco. El delimitador entre el nombre y el valor de un parámetro es '=' por defecto, y el separador de parámetros es '&' por defecto.
var $new_var extract_param [-i] param_name src_string [separator] [delimiter];
# ejemplo: una consulta "foo=123&bar=456&baz=789". Si el nombre del parámetro es bar y el separador es &, entonces el valor resultante de la variable será 456.
# var $extraed_arg_bar extract_param bar "foo=123&bar=456&baz=789" & =;
#### Operación JSON ####
# Extrae el valor json de una cadena json válida.
# Requiere que la biblioteca cJSON esté instalada (ver sección de Instalación)
var $new_var extract_json json subkey1 [subkey2] [subkey3] ...;
# Soporta claves de objetos anidados e índices de arreglos [n]
# Devuelve valores de cadena sin comillas, otros tipos como cadenas JSON
# Los arreglos y objetos se devuelven como cadenas JSON compactas
# Ejemplos:
# Extraer de un objeto anidado
# var $new_var extract_json '{"a":{"b":{"c":3}}}' a b c;
# Resultado: 3
# Extraer de un arreglo usando [índice]
# var $new_var extract_json '{"users":[{"name":"Alice"},{"name":"Bob"}]}' users [0] name;
# Resultado: Alice
# Extraer arreglo como cadena JSON
# var $items extract_json '{"data":[1,2,3]}' data;
# Resultado: [1,2,3]
# Extraer objeto como cadena JSON
# var $user extract_json '{"user":{"name":"Bob","age":30}}' user;
# Resultado: {"name":"Bob","age":30}
#### Juicio Regex ####
# Verifica si regex coincide, devuelve 1 o 0
var $bool_var regex_match [-i] src_str match_regex;
#### Operaciones Regex ####
# Captura regex
var $new_var regex_capture [-i] src_str regex assign_value;
# Sustituye regex
var $new_var regex_sub [-i] src_str regex replacement;
#### Juicio Matemático ####
# Verifica si los números son iguales, devuelve 1 o 0
var $bool_var eq num1 num2;
# Verifica si los números no son iguales, devuelve 1 o 0
var $bool_var ne num1 num2;
# Verifica si es menor que, devuelve 1 o 0
var $bool_var lt num1 num2;
# Verifica si es menor o igual, devuelve 1 o 0
var $bool_var le num1 num2;
# Verifica si es mayor que, devuelve 1 o 0
var $bool_var gt num1 num2;
# Verifica si es mayor o igual, devuelve 1 o 0
var $bool_var ge num1 num2;
# Verifica si está dentro del rango start_num end_num, si end_num no está especificado, el rango es [0, start_num], devuelve 1 o 0
var $bool_var range num start_num [end_num];
# Verifica si el número es uno de num2 .. numn, devuelve 1 o 0
var $bool_var in num1 num2 .. numn;
### Operaciones Matemáticas ####
# Valor absoluto (devuelve el formato original sin signo negativo)
var $new_var abs num;
# Valor máximo (devuelve con formato original)
var $new_var max num1 num2;
# Valor mínimo (devuelve con formato original)
var $new_var min num1 num2;
# Suma entera
var $new_var add int1 int2;
# Resta entera
var $new_var sub int1 int2;
# Multiplicación entera
var $new_var mul int1 int2;
# División entera, int2 no puede ser 0
var $new_var div int1 int2;
# Módulo entero, int2 no puede ser 0
var $new_var mod int1 int2;
# Operación AND a nivel de bits
var $new_var bitwise_and int1 int2;
# Operación NOT a nivel de bits
var $new_var bitwise_not int;
# Operación OR a nivel de bits
var $new_var bitwise_or int1 int2;
# Operación XOR a nivel de bits (o exclusivo)
var $new_var bitwise_xor int1 int2;
# Operación de desplazamiento a la izquierda, shift_bits debe ser >= 0
var $new_var lshift int shift_bits;
# Operación de desplazamiento a la derecha (desplazamiento aritmético, bit de signo preservado), shift_bits debe ser >= 0
var $new_var rshift int shift_bits;
# Operación de desplazamiento a la derecha sin signo (desplazamiento lógico, relleno con ceros), shift_bits debe ser >= 0
var $new_var urshift int shift_bits;
# Redondear a n dígitos significativos
var $new_var round src_num int;
# Truncar la parte decimal directamente (sin redondear)
var $new_var int src_num;
# Valor de piso, el entero más grande menor o igual que el origen
var $new_var floor src_num;
# Valor de techo, el entero más pequeño mayor o igual que el origen
var $new_var ceil src_num;
# Entero positivo aleatorio, el rango es [start_int, end_int], si end_int no está especificado, el rango es [0, start_int]
var $new_var rand [start_int] [end_int];
# Secuencia hex aleatoria en especificado. number_of_bytes debe ser de 1 a 32, el valor predeterminado es 32
var $new_var hexrand [number_of_bytes];
#### Codificación y Decodificación ####
# Convierte binario a hexadecimal
var $new_var hex_encode src_str;
# Convierte hexadecimal a binario
var $new_var hex_decode src_str;
# Decimal a hexadecimal
var $new_var dec_to_hex dec;
# Hexadecimal a decimal
var $new_var hex_to_dec hex;
# Codificación completa de URI
var $new_var escape_uri src_str;
# Codificación de argumentos
var $new_var escape_args src_str;
# Codificación de componente de URI
var $new_var escape_uri_component src_str;
# Codificación HTML
var $new_var escape_html src_str;
# Decodificación de URI
var $new_var unescape_uri src_str;
# Codificación Base64
var $new_var base64_encode src_str;
# Codificación Base64url
var $new_var base64url_encode src_str;
# Decodificación Base64
var $new_var base64_decode src_str;
# Decodificación Base64url
var $new_var base64url_decode src_str;
#### Cálculos de Hash Criptográficos ####
# 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;
# Encriptación HMAC_MD5
var $new_var hmac_md5 src_str secret;
# Encriptación HMAC_SHA1
var $new_var hmac_sha1 src_str secret;
# Encriptación HMAC_SHA224
var $new_var hmac_sha224 src_str secret;
# Encriptación HMAC_SHA256
var $new_var hmac_sha256 src_str secret;
# Encriptación HMAC_SHA384
var $new_var hmac_sha384 src_str secret;
# Encriptación HMAC_SHA512
var $new_var hmac_sha512 src_str secret;
#### Juicio de Rango de Tiempo ####
# Determina si el tiempo actual cumple con el rango de tiempo dado, requiere al menos un parámetro.
# Devuelve 1 si se cumplen todas las condiciones, de lo contrario devuelve 0.
# El día de la semana se representa por 0-6, donde el domingo es 0, y el formato de zona horaria es 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];
#### Formato de Tiempo ####
# Convierte timestamp a tiempo HTTP (tiempo actual si se omite el timestamp)
var $new_var gmt_time [src_ts] http_time;
# Convierte timestamp a tiempo de cookie (tiempo actual si se omite el timestamp)
var $new_var gmt_time [src_ts] cookie_time;
# Convierte timestamp a tiempo GMT en el formato especificado (tiempo actual si se omite el timestamp)
var $new_var gmt_time [src_ts] date_format;
# Convierte timestamp a tiempo local en el formato especificado (tiempo actual si se omite el timestamp)
var $new_var local_time [src_ts] date_format;
# Devuelve el timestamp actual
var $new_var unix_time;
# Convierte tiempo HTTP a timestamp
var $new_var unix_time src_time http_time;
# Convierte fecha especificada a timestamp (devuelve timestamp actual si todos se omiten)
var $new_var unix_time src_time date_format [timezone];
#### IP ####
# Determina si la dirección ip está dentro del rango ip, cidr o ipv4, si es así, devuelve 1, de lo contrario devuelve 0
var $bool_var ip_range ip_str [ipv4 | ipv6 | cidr | ipv4_range ] ...;
# Calcula la dirección de red basada en la dirección IP y los bits de red
# Para IPv4: el rango de network_bits es 1-32
# Para IPv6: el rango de network_bits es 1-128
# Si ipv6_network_bits no está especificado, se utilizará el mismo valor que ipv4_network_bits
# Devuelve solo la dirección de red sin la longitud del prefijo (por ejemplo, "10.0.0.0" no "10.0.0.0/8")
var $new_var cidr ipv4/ipv6 ipv4_network_bits [ipv6_network_bits];
Todos los parámetros excepto las expresiones regulares pueden contener variables. Sin embargo, los valores de parámetros incorrectos causarán que el resultado del cálculo de la función esté vacío.
Las variables definidas con la directiva var pueden ser sobrescritas por directivas como set y auth_request_set.
El parámetro if habilita la variable condicional. var no se asignará un valor si la condición evalúa a “0” o una cadena vacía. Y continuará buscando definiciones posteriores de esta variable.
# Cuando el encabezado de solicitud A está presente, el valor de la variable es 'have-header-a'
var $new_var set have-header-a if=$http_a;
# Cuando el encabezado de solicitud A no está presente pero el encabezado de solicitud B está presente, el valor de la variable es 'have-header-b'
var $new_var set have-header-b if=$http_b;
# Cuando ambos encabezados de solicitud A y B no están presentes, el valor de la variable es 'not-have-a-or-b'
var $new_var set not-have-a-or-b;
GitHub
Puedes encontrar consejos adicionales de configuración y documentación para este módulo en el repositorio de GitHub para nginx-module-var.