# конспект · шаг 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 |
Два правила, снимающие половину вопросов
$uriменяется,$request_uri- нет. Послеrewriteилиtry_files$uriуже другой. Поэтому редирект пишут так:
return 301 https://$host$request_uri;
- Любой заголовок запроса доступен как
$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при этом верный.
Комментарии
Пока нет комментариев. Будь первым!
Оставить комментарий