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

var: Динамическое присвоение переменных через предопределенные функции

Установка Debian/Ubuntu

Эти документы относятся к пакету APT nginx-module-var, предоставляемому репозиторием GetPageSpeed Extras.

  1. Настройте репозиторий APT, как описано в настройке репозитория APT.
  2. Установите модуль:
sudo apt-get update
sudo apt-get install nginx-module-var
Показать дистрибутивы и архитектуры
| Дистрибутив | Версия            | Компонент   | Архитектуры     |
|-------------|-------------------|-------------|-----------------|
| debian      | bookworm          | main        | amd64, arm64    |
| debian      | bookworm-mainline | main        | amd64, arm64    |
| debian      | trixie            | main        | amd64, arm64    |
| debian      | trixie-mainline   | main        | amd64, arm64    |
| ubuntu      | focal             | main        | amd64, arm64    |
| ubuntu      | focal-mainline    | main        | amd64, arm64    |
| ubuntu      | jammy             | main        | amd64, arm64    |
| ubuntu      | jammy-mainline    | main        | amd64, arm64    |
| ubuntu      | noble             | main        | amd64, arm64    |
| ubuntu      | noble-mainline    | main        | amd64, arm64    |

ngx_http_var_module — это модуль nginx, который динамически присваивает новые переменные через предопределенные функции.

Содержание

Статус

Этот модуль Nginx в настоящее время считается экспериментальным. Проблемы и запросы на изменение приветствуются, если вы столкнетесь с какими-либо проблемами.

Синопсис

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 содержит [-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;

Результат: Алиса

Извлечение массива в виде строки JSON

var $items extract_json '{"data":[1,2,3]}' data;

Результат: [1,2,3]

Извлечение объекта в виде JSON-строки

var $user extract_json '{"user":{"name":"Bob","age":30}}' user;

Результат:

Оценка регулярного выражения

Проверьте, соответствует ли регулярное выражение, возвращает 1 или 0

var $bool_var regex_match [-i] src_str match_regex;

Операции с регулярными выражениями

Захват регэксп

var $new_var regex_capture [-i] src_str regex assign_value;

Замена regex

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 в 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 побитовое_и int1 int2;

Побитовая операция NOT

var $new_var побитовый_не int;

Побитовое ИЛИ

var $new_var побитовое_или 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;

Округление вверх, наименьшее целое число, большее или равное источнику

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;

Преобразовать отметку времени в куки-время (текущее время, если отметка времени опущена)

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; ```