# конспект · шаг 1 из 1
Конспект раздела: rewrite, return, map
Раздел про порядок фаз и про инструменты, которые этим порядком пользуются.
Фазы - главная схема раздела
server rewrite → find location → rewrite → preaccess → access
→ try_files → content → filters
| Следствие | Почему важно |
|---|---|
return в location бьёт deny |
rewrite идёт до access |
return в server{} бьёт выбор location |
это самая ранняя фаза |
| лимиты считаются после перезаписи | ключ может измениться |
return и rewrite
return 301 https://$host$request_uri;
return 444; # закрыть соединение
rewrite ^/old/(.*)$ /new/$1 permanent; # 301
rewrite ^/api/(.*)$ /$1 break; # переписать и остаться в location
Замена - весь новый URI: несовпавший хвост не дописывается, его переносят
скобками. Голый адрес без кода в return даёт 302, а не 301. break не
только оставляет запрос в блоке, но и обрывает остальные директивы фазы -
return после него не выполнится.
Предел - десять перезаписей: замер цепочкой даёт 200 на десятой и 500 на
одиннадцатой, со строкой rewrite or internal redirection cycle в error_log.
if и его замены
Безопасны внутри if только return, rewrite, set, break. Всё остальное:
по имени сайта → отдельный server
по URI → отдельный location
по методу → limit_except
по наличию файла → try_files
по чему угодно ещё → map (или geo для адресов)
Ловушки раздела списком
$uriвместо$request_uriв редиректе - пропадает строка запроса;rewrite … lastпередproxy_pass- нуженbreak;returnвместоdeny- «закрытая» директория отвечает 200;- два
ifподряд выполняются ОБА, последовательно (замер:r=AB); add_headerвнутри сработавшегоifотменяет заголовки снаружи;proxy_passвнутриifконфиг принимает - и блок начинает слать на два разных адреса в зависимости от запроса;error_page 404 = 200 …с пробелом не грузится, верно=200;- регистр в nginx складывается только на латинице:
~*и точные ключиmapне считаютбольшиеиБОЛЬШИЕодним значением; - значение
mapкешируется на запрос и послеrewriteостаётся старым - если это мешает, нуженvolatile; - переменная в
proxy_passотменяет подстановку хвоста URI.
Свежее
CVE-2026-42533 (переполнение в map с захватами) закрыт в 1.31.3 и 1.30.4;
CVE-2026-42945 (heap overflow в ngx_http_rewrite_module) - в 1.31.0.
Чек-лист: что ты должен уметь объяснить
- Порядок фаз и три следствия из него.
- Чем
lastотличается отbreak. - Почему
ifназывают злом и какие директивы в нём безопасны. - Как заменить сложное условие через
map. - Сколько перезаписей проходит и что видно в логе на лишней.
- Почему
nginx -tне защищает отifсproxy_pass. - Что кеширует
mapи когда нуженvolatile.
Комментарии
Пока нет комментариев. Будь первым!
Оставить комментарий