var: Динамическое присвоение переменной через предопределенные функции
Установка
Вы можете установить этот модуль в любой дистрибутив на базе RHEL, включая, но не ограничиваясь:
- RedHat Enterprise Linux 7, 8, 9 и 10
- CentOS 7, 8, 9
- AlmaLinux 8, 9
- Rocky Linux 8, 9
- Amazon Linux 2 и 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
Активируйте модуль, добавив следующее в начало файла /etc/nginx/nginx.conf:
load_module modules/ngx_http_var_module.so;
Этот документ описывает nginx-module-var v0.1.1, выпущенный 23 февраля 2026 года.
server {
listen 127.0.0.1:8080;
server_name localhost;
location / {
var $new_var set $scheme://$host$request_uri;
}
}
Директивы
var
Синтаксис: var $new_variable function [-i] args... [if\=condition]
По умолчанию: -
Контекст: http, server, location
Определяет новую переменную, значение которой является результатом вычисления функции. Значение переменной не может быть кэшировано и пересчитывается каждый раз при использовании.
Если текущий уровень не определяет переменную с тем же именем, она может быть унаследована с предыдущего уровня.
Параметр -i используется для игнорирования регистра (доступен только в некоторых функциях).
За исключением имени функции, параметра -i и регулярного выражения, все параметры могут содержать переменные.
Когда значение параметра недопустимо, значение переменной становится пустым. В булевых функциях недопустимые параметры также приведут к пустому значению вместо 0.
var не может использоваться для одновременного определения одной и той же переменной с директивами map или geo. Однако директива set может быть использована для переопределения переменных, определенных с помощью var.
Доступны следующие функции:
#### Условное суждение ####
# Возвращает 1, если входной параметр пуст или 0, в противном случае возвращает 0
var $bool_var not str;
# Возвращает 1, если все входные параметры непустые и не равны 0, в противном случае возвращает 0
var $bool_var and str1 str2...;
# Возвращает 1, если любой входной параметр непустой и не равен 0, в противном случае возвращает 0
var $bool_var or str1 str2...;
#### Строковое суждение ####
# Проверяет, является ли строка пустой, возвращает 1 или 0
var $bool_var is_empty str;
# Проверяет, является ли строка непустой, возвращает 1 или 0
var $bool_var is_not_empty str;
# Проверяет, является ли строка числом, возвращает 1 или 0. Разрешены только десятичные числа. Поддерживаются отрицательные числа и дроби.
var $bool_var is_num str;
# Проверяет, равны ли строки, возвращает 1 или 0
var $bool_var str_eq [-i] str1 str2;
# Проверяет, не равны ли строки, возвращает 1 или 0
var $bool_var str_ne [-i] str1 str2;
# Проверяет, имеет ли строка указанный префикс, возвращает 1 или 0
var $bool_var starts_with [-i] str prefix;
# Проверяет, имеет ли строка указанный суффикс, возвращает 1 или 0
var $bool_var ends_with [-i] str suffix;
# Проверяет, присутствует ли подстрока, возвращает 1 или 0
var $bool_var contains [-i] str sub_str;
# Проверяет, является ли str1 одним из str2 .. strn, возвращает 1 или 0
var $bool_var str_in [-i] str1 str2 str3 .. strn;
#### Общие операции со строками ####
# Установить значение переменной напрямую
var $new_var set src_str;
# Длина строки
var $new_var len src_str;
# Преобразовать в верхний регистр
var $new_var upper src_str;
# Преобразовать в нижний регистр
var $new_var lower src_str;
# Сделать первую букву каждого слова заглавной (слова разделены неалфавитными символами)
var $new_var initcap src_str;
# Удалить ведущие и завершающие пробелы или другие символы
var $new_var trim src_str [char];
# Удалить ведущие пробелы или другие символы
var $new_var ltrim src_str [char];
# Удалить завершающие пробелы или другие символы
var $new_var rtrim src_str [char];
# Реверсировать строку
var $new_var reverse src_str;
# Получить начальную позицию подстроки
var $new_var position [-i] src_str sub_str;
# Повторить строку заданное количество раз
var $new_var repeat src_str times;
# Извлечь подстроку
var $new_var substr src_str start [len];
# Заменить ключевое слово
var $new_var replace [-i] src_str src dst;
# Извлечь параметры
# Извлечь значение из списка параметров. Пример использования - извлечение параметров запроса без написания регулярного выражения, но также может использоваться для поиска значений в любом списке пар имя/значение. Если несколько вхождений параметра существуют, возвращается только первое. Переменная получает пустое значение. Разделитель между именем и значением параметра по умолчанию - '=', а разделитель параметров - '&'.
var $new_var extract_param [-i] param_name src_string [separator] [delimiter];
# пример: запрос "foo=123&bar=456&baz=789". Если имя параметра bar и разделитель &, то значение переменной будет 456.
# var $extraed_arg_bar extract_param bar "foo=123&bar=456&baz=789" & =;
#### Операции с JSON ####
# Извлечь значение json из корректной json-строки.
# Требуется установить библиотеку cJSON (см. раздел Установка)
var $new_var extract_json json subkey1 [subkey2] [subkey3] ...;
# Поддерживает вложенные ключи объектов и индексы массивов [n]
# Возвращает строковые значения без кавычек, другие типы как JSON-строки
# Массивы и объекты возвращаются как компактные JSON-строки
# Примеры:
# Извлечение из вложенного объекта
# var $new_var extract_json '{"a":{"b":{"c":3}}}' a b c;
# Результат: 3
# Извлечение из массива с использованием [index]
# var $new_var extract_json '{"users":[{"name":"Alice"},{"name":"Bob"}]}' users [0] name;
# Результат: Alice
# Извлечение массива как JSON-строки
# var $items extract_json '{"data":[1,2,3]}' data;
# Результат: [1,2,3]
# Извлечение объекта как JSON-строки
# var $user extract_json '{"user":{"name":"Bob","age":30}}' user;
# Результат: {"name":"Bob","age":30}
#### Проверка регулярных выражений ####
# Проверка соответствия регулярному выражению, возвращает 1 или 0
var $bool_var regex_match [-i] src_str match_regex;
#### Операции с регулярными выражениями ####
# Захват регулярного выражения
var $new_var regex_capture [-i] src_str regex assign_value;
# Замена регулярного выражения
var $new_var regex_sub [-i] src_str regex replacement;
#### Математическое суждение ####
# Проверка на равенство чисел, возвращает 1 или 0
var $bool_var eq num1 num2;
# Проверка на неравенство чисел, возвращает 1 или 0
var $bool_var ne num1 num2;
# Проверка на меньшее, возвращает 1 или 0
var $bool_var lt num1 num2;
# Проверка на меньшее или равное, возвращает 1 или 0
var $bool_var le num1 num2;
# Проверка на большее, возвращает 1 или 0
var $bool_var gt num1 num2;
# Проверка на большее или равное, возвращает 1 или 0
var $bool_var ge num1 num2;
# Проверка на нахождение в диапазоне start_num end_num, если end_num не указан, диапазон - [0, start_num], возвращает 1 или 0
var $bool_var range num start_num [end_num];
# Проверка, является ли число одним из num2 .. numn, возвращает 1 или 0
var $bool_var in num1 num2 .. numn;
### Математические операции ####
# Абсолютное значение (возвращает оригинальный формат без отрицательного знака)
var $new_var abs num;
# Максимальное значение (возвращает в оригинальном формате)
var $new_var max num1 num2;
# Минимальное значение (возвращает в оригинальном формате)
var $new_var min num1 num2;
# Целочисленное сложение
var $new_var add int1 int2;
# Целочисленное вычитание
var $new_var sub int1 int2;
# Целочисленное умножение
var $new_var mul int1 int2;
# Целочисленное деление, int2 не может быть 0
var $new_var div int1 int2;
# Целочисленный модуль, int2 не может быть 0
var $new_var mod int1 int2;
# Побитовая операция И
var $new_var bitwise_and int1 int2;
# Побитовая операция НЕ
var $new_var bitwise_not int;
# Побитовая операция ИЛИ
var $new_var bitwise_or int1 int2;
# Побитовая операция XOR (исключающее ИЛИ)
var $new_var bitwise_xor int1 int2;
# Операция сдвига влево, shift_bits должно быть >= 0
var $new_var lshift int shift_bits;
# Операция сдвига вправо (арифметический сдвиг, знак сохраняется), shift_bits должно быть >= 0
var $new_var rshift int shift_bits;
# Беззнаковый сдвиг вправо (логический сдвиг, заполнение нулями), shift_bits должно быть >= 0
var $new_var urshift int shift_bits;
# Округление до n значащих цифр
var $new_var round src_num int;
# Удаление десятичной части напрямую (без округления)
var $new_var int src_num;
# Значение floor, наибольшее целое число, меньшее или равное источнику
var $new_var floor src_num;
# Значение ceil, наименьшее целое число, большее или равное источнику
var $new_var ceil src_num;
# Случайное положительное целое число, диапазон [start_int, end_int], если end_int не указан, диапазон [0, start_int]
var $new_var rand [start_int] [end_int];
# Случайная шестнадцатеричная последовательность в указанном диапазоне. number_of_bytes должно быть от 1 до 32, по умолчанию 32
var $new_var hexrand [number_of_bytes];
#### Кодирование и декодирование ####
# Преобразовать двоичное в шестнадцатеричное
var $new_var hex_encode src_str;
# Преобразовать шестнадцатеричное в двоичное
var $new_var hex_decode src_str;
# Десятичное в шестнадцатеричное
var $new_var dec_to_hex dec;
# Шестнадцатеричное в десятичное
var $new_var hex_to_dec hex;
# Полное кодирование URI
var $new_var escape_uri src_str;
# Кодирование аргументов
var $new_var escape_args src_str;
# Кодирование компонента URI
var $new_var escape_uri_component src_str;
# Кодирование HTML
var $new_var escape_html src_str;
# Декодирование URI
var $new_var unescape_uri src_str;
# Кодирование Base64
var $new_var base64_encode src_str;
# Кодирование Base64url
var $new_var base64url_encode src_str;
# Декодирование Base64
var $new_var base64_decode src_str;
# Декодирование Base64url
var $new_var base64url_decode src_str;
#### Вычисления криптографического хеша ####
# 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
var $new_var hmac_md5 src_str secret;
# Шифрование HMAC_SHA1
var $new_var hmac_sha1 src_str secret;
# Шифрование HMAC_SHA224
var $new_var hmac_sha224 src_str secret;
# Шифрование HMAC_SHA256
var $new_var hmac_sha256 src_str secret;
# Шифрование HMAC_SHA384
var $new_var hmac_sha384 src_str secret;
# Шифрование HMAC_SHA512
var $new_var hmac_sha512 src_str secret;
#### Проверка диапазона времени ####
# Определяет, соответствует ли текущее время заданному диапазону времени, требуется как минимум один параметр.
# Возвращает 1, если все условия выполнены, в противном случае возвращает 0.
# День недели представлен числами от 0 до 6, где воскресенье - 0, а формат часового пояса - 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];
#### Формат времени ####
# Преобразовать временную метку в HTTP-время (текущее время, если временная метка опущена)
var $new_var gmt_time [src_ts] http_time;
# Преобразовать временную метку в время cookie (текущее время, если временная метка опущена)
var $new_var gmt_time [src_ts] cookie_time;
# Преобразовать временную метку в GMT-время в указанном формате (текущее время, если временная метка опущена)
var $new_var gmt_time [src_ts] date_format;
# Преобразовать временную метку в местное время в указанном формате (текущее время, если временная метка опущена)
var $new_var local_time [src_ts] date_format;
# Вернуть текущую временную метку
var $new_var unix_time;
# Преобразовать HTTP-время в временную метку
var $new_var unix_time src_time http_time;
# Преобразовать указанную дату в временную метку (возвращает текущую временную метку, если все опущены)
var $new_var unix_time src_time date_format [timezone];
#### IP ####
# Определяет, находится ли IP-адрес в диапазоне ip, cidr или ipv4, если да, возвращает 1, в противном случае возвращает 0
var $bool_var ip_range ip_str [ipv4 | ipv6 | cidr | ipv4_range ] ...;
# Вычисляет сетевой адрес на основе IP-адреса и бит сети
# Для IPv4: диапазон network_bits от 1 до 32
# Для IPv6: диапазон network_bits от 1 до 128
# Если ipv6_network_bits не указан, будет использоваться то же значение, что и для ipv4_network_bits
# Возвращает только сетевой адрес без длины префикса (например, "10.0.0.0", а не "10.0.0.0/8")
var $new_var cidr ipv4/ipv6 ipv4_network_bits [ipv6_network_bits];
Все параметры, кроме регулярных выражений, могут содержать переменные. Однако неверные значения параметров приведут к тому, что результат вычисления функции будет пустым.
Переменные, определенные с помощью директивы var, могут быть переопределены директивами, такими как set и auth_request_set.
Параметр if включает условную переменную. var не будет присваивать значение, если условие оценивается как “0” или пустая строка. И он продолжит искать последующие определения этой переменной.
# Когда заголовок запроса A присутствует, значение переменной равно 'have-header-a'
var $new_var set have-header-a if=$http_a;
# Когда заголовок запроса A отсутствует, но заголовок запроса B присутствует, значение переменной равно 'have-header-b'
var $new_var set have-header-b if=$http_b;
# Когда оба заголовка запроса A и B отсутствуют, значение переменной равно 'not-have-a-or-b'
var $new_var set not-have-a-or-b;
GitHub
Вы можете найти дополнительные советы по конфигурации и документацию для этого модуля в репозитории GitHub для nginx-module-var.