Перейти к содержанию

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.3 выпущенный 2 апреля 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;

## Побитовая операция AND
var $new_var bitwise_and int1 int2;

## Побитовая операция NOT
var $new_var bitwise_not int;

## Побитовая операция OR
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;

## Значение ceiling, наименьшее целое число, большее или равное источнику
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.