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

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.