1. 1
  2. 2
  3. 3

# конспект · шаг 3 из 3

Конспект: переменные

выжимка - её можно унести в заметки

Переменные - способ написать конфиг, который зависит от запроса. Вычисляются на каждый запрос и в момент обращения, а не при старте.

Десять, которые нужны каждый день

Значения для GET /catalog/42?sort=price с заголовком Host: Shop.Local:80.

Переменная Пример Что это
$uri /catalog/42 путь после внутренних преобразований, без строки запроса
$request_uri /catalog/42?sort=price исходный URI целиком, как прислал клиент
$args sort=price строка запроса
$arg_sort price один параметр по имени
$is_args ? пусто, если параметров нет
$host shop.local имя в нижнем регистре и без порта
$http_host Shop.Local:80 сырой заголовок Host как прислали
$remote_addr 203.0.113.7 адрес того, кто подключился
$status 200 код ответа; на фазе rewrite ещё 000
$request_id 9f2c… уникальный id запроса, генерирует сам nginx

Два правила, снимающие половину вопросов

  1. $uri меняется, $request_uri - нет. После rewrite или try_files $uri уже другой. Поэтому редирект пишут так:
return 301 https://$host$request_uri;
  1. Любой заголовок запроса доступен как $http_имя (имя в нижнем регистре, дефисы → подчёркивания). Заголовки ответа - $sent_http_имя.

Свои переменные

set - в server, location и if. На уровне http его нет: там ещё нет обработки запроса, и для этого уровня существует map.

map $http_user_agent $is_bot {
    default   0;
    "~*bot"   1;
}

Отладочный приём

add_header X-Debug-Uri "$uri | $request_uri | $host" always;

Не понимаешь, что nginx видит - выведи это в заголовок и посмотри curl -I. Убрать перед выкладкой обязательно: $http_cookie в заголовке ответа - утечка.

Ловушки джокера

  • Редирект через $uri вместо $request_uri молча теряет строку запроса: ?utm_source=mail пропадает вместе со статистикой рассылки. Симптом плавающий - на страницах без параметров всё работает.
  • unknown "…" variable приходит без номера строки. Искать опечатку в имени придётся самому: nginx -T | grep -n '\$имя'.
  • $1-$9 заняты скобочными группами регулярок и вне регулярки пусты. Строка "цена $5 рублей" отдаст цена рублей.
  • Значение спрашивают в момент использования, и раньше времени его нет. $status на фазе rewrite равен 000, а $body_bytes_sent в add_header - нулю: тело ещё не отправлено. Сам $status в add_header при этом верный.

Комментарии

Пока нет комментариев. Будь первым!

Оставить комментарий

Комментарий появится после проверки. Email не публикуется. Войти, чтобы не вводить имя каждый раз.