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

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.0, выпущенный 6 января 2026 года.


server {
    listen 127.0.0.1:8080;
    server_name localhost;

    location / {
        var $copy_var copy $scheme://$host$request_uri;
    }
}

Директивы

var

Синтаксис: var $new_variable operator [-i] args... [if\=condition]

По умолчанию: -

Контекст: http, server, location

Определяет переменную, значение которой является результатом вычисления функции. Значение переменной не может быть закешировано и пересчитывается каждый раз при использовании. Если на текущем уровне не определена переменная с тем же именем, она может быть унаследована с предыдущего уровня. Параметр -i используется для игнорирования регистра.

Доступны следующие функции:

#### Условное суждение ####
## Возвращает 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 if_empty str;

## Проверяет, является ли строка непустой, возвращает 1 или 0
var $bool_var if_not_empty str;

## Проверяет, является ли строка числом, возвращает 1 или 0
var $bool_var if_is_num str;

## Проверяет, равны ли строки, возвращает 1 или 0
var $bool_var if_str_eq [-i] str1 str2;

## Проверяет, не равны ли строки, возвращает 1 или 0
var $bool_var if_str_ne [-i] str1 str2;

## Проверяет, имеет ли строка указанный префикс, возвращает 1 или 0
var $bool_var if_starts_with [-i] str prefix;

## Проверяет, имеет ли строка указанный суффикс, возвращает 1 или 0
var $bool_var if_ends_with [-i] str suffix;

## Проверяет, присутствует ли подстрока, возвращает 1 или 0
var $bool_var if_find [-i] str sub_str;

## Проверяет, является ли str1 одним из str2 .. strn, возвращает 1 или 0
var $bool_var if_str_in [-i] str1 str2 str3 .. strn;

#### Общие строковые операции ####
## Копирует значение переменной
var $new_var copy src_str;

## Длина строки
var $new_var len src_str;

## Преобразует в верхний регистр
var $new_var upper src_str;

## Преобразует в нижний регистр
var $new_var lower src_str;

## Удаляет пробелы в начале и конце строки
var $new_var trim src_str;

## Удаляет пробелы в начале строки
var $new_var ltrim src_str;

## Удаляет пробелы в конце строки
var $new_var rtrim src_str;

## Реверсирует строку
var $new_var reverse src_str;

## Получает начальную позицию подстроки
var $new_var find [-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; 


#### Регулярные выражения ####
## Проверяет, соответствует ли регулярное выражение, возвращает 1 или 0
var $bool_var if_re_match [-i] src_str match_regex;


#### Операции с регулярными выражениями ####
## Захватывает регулярное выражение
var $new_var re_capture [-i] src_str capture_regex assign_value;

## Подменяет регулярное выражение
var $new_var re_sub [-i] src_str capture_regex assign_value;

## Глобальная подмена регулярного выражения
var $new_var re_gsub [-i] src_str capture_regex assign_value;


#### Математическое суждение ####
## Проверяет, равны ли числа, возвращает 1 или 0
var $bool_var if_eq num1 num2;

## Проверяет, не равны ли числа, возвращает 1 или 0
var $bool_var if_ne num1 num2;

## Проверяет, меньше ли, возвращает 1 или 0
var $bool_var if_lt num1 num2;

## Проверяет, меньше ли или равно, возвращает 1 или 0
var $bool_var if_le num1 num2;

## Проверяет, больше ли, возвращает 1 или 0
var $bool_var if_gt num1 num2;

## Проверяет, больше ли или равно, возвращает 1 или 0
var $bool_var if_ge num1 num2;

## Проверяет, находится ли в диапазоне start_num-end_num, возвращает 1 или 0
var $bool_var if_range num start_num-end_num;

## Проверяет, является ли число одним из num2 .. numn, возвращает 1 или 0
var $bool_var if_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;

## Округление до n значащих цифр
var $new_var round src_num int;

## Округление вниз, наибольшее целое число, меньшее или равное источнику
var $new_var floor src_num;

## Округление вверх, наименьшее целое число, большее или равное источнику
var $new_var ceil src_num;

## Случайное большое положительное целое число
var $new_var rand;

## Случайное положительное целое число в заданном диапазоне
var $new_var rand_range start_int-end_int;


#### Кодирование и декодирование ####
## Преобразует двоичное в шестнадцатеричное
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_short src_str;

## Кодирование CRC32 (для длинной строки)
var $new_var crc32_long src_str;

## Кодирование MD5
var $new_var md5sum src_str;

## Кодирование SHA1
var $new_var sha1sum src_str;

## Кодирование SHA256
var $new_var sha256sum src_str;

## Кодирование SHA384
var $new_var sha384sum src_str;

## Кодирование SHA512
var $new_var sha512sum src_str;

## Шифрование HMAC_SHA1
var $new_var hmac_sha1 src_str secret;

## Шифрование HMAC_SHA256
var $new_var hmac_sha256 src_str secret;

#### Суждение по диапазону времени ####
## Определяет, соответствует ли текущее время заданному диапазону времени, требует как минимум один параметр.
## Возвращает 1, если все условия выполнены, иначе возвращает 0.
## День недели обозначается числами от 1 до 7, где воскресенье - 7, а формат часового пояса - gmt+0800
var $bool_var if_time_range [year=year_range] [month=month_range] [day=day_range] [wday=wday_range(1-7)] [hour=hour_range] [min=min_range] [sec=sec_range] [timezone];


#### Формат времени ####
## Преобразует временную метку в GMT время в заданном формате (текущее время, если временная метка опущена)
var $new_var gmt_time [src_ts] date_format;

## Преобразует временную метку в HTTP время (текущее время, если временная метка опущена)
var $new_var gmt_time [src_ts] http_time;

## Преобразует временную метку в время cookie (текущее время, если временная метка опущена)
var $new_var gmt_time [src_ts] cookie_time;

## Преобразует временную метку в местное время в заданном формате (текущее время, если временная метка опущена)
var $new_var local_time [src_ts] date_format;

## Возвращает текущую временную метку
var $new_var unixtime;

## Преобразует HTTP время в временную метку
var $new_var unixtime src_http_time http_time;

## Преобразует указанную дату в временную метку (возвращает текущую временную метку, если все опущены)
var $new_var unixtime src_time date_format timezone; 


#### Суждение по диапазону IP ####
## Определяет, находится ли IP-адрес в диапазоне IP, если да, возвращает 1, иначе возвращает 0
var $bool_var if_ip_range ip_str ip_range_str1 ip_range_str2...;


#### HTTP Информация ####
## Получает значение указанного аргумента запроса, arg_name может включать '-' и не зависит от регистра.
var $new_var get_arg argname;

## Получает значение указанного имени cookie запроса, cookie_name может включать '-' или '.' и не зависит от регистра.
var $new_var get_cookie cookie_name;

## Получает значение указанного имени Set-Cookie upstream, cookie_name может включать '-' или '.' и не зависит от регистра.
var $new_var get_upstream_cookie cookie_name;

Все параметры, кроме регулярных выражений, могут содержать переменные. Однако неправильные значения параметров приведут к тому, что результат вычисления функции будет пустым.

Переменные, определенные с помощью директивы var, могут быть переопределены такими директивами, как set и auth_request_set.

Параметр if включает условный var. var не будет присваиваться значение, если условие оценивается как “0” или пустая строка. И он продолжит искать последующие определения этой переменной.

## Когда заголовок запроса A присутствует, значение переменной равно 'have-header-a'
var $new_var copy have-header-a if=$http_a;

## Когда заголовок запроса A отсутствует, но заголовок запроса B присутствует, значение переменной равно 'have-header-b'
var $new_var copy have-header-b if=$http_b;

## Когда оба заголовка запроса A и B отсутствуют, значение переменной равно 'not-have-a-or-b'
var $new_var copy not-have-a-or-b;

GitHub

Вы можете найти дополнительные советы по конфигурации и документацию для этого модуля в репозитории GitHub для nginx-module-var.