1. 1
  2. 2
  3. 3
  4. 4
  5. 5

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

Конспект: вложенные и именованные location

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

Вложенные и именованные location: когда они помогают и где перестают работать.

Вложенные

Внутри выбранного location поиск повторяется - по тому же алгоритму и по полному URI.

location /uploads/ {
    root /var/www;
    location ~ \.(jpg|png)$ {
        expires 30d;          # у картинок свой срок кеша
    }
}

Что вообще разрешено вкладывать

Проверяется при загрузке, а не молча:

Внешний блок Что можно вложить
префикс /api/ префикс, точное и регулярку - если путь начинается с /api/
регулярка ~ ^/api/ только другую регулярку
именованный @backend ничего
↳  выводnginx -t
nginx: [emerg] location "/cart" is outside location "/api/"
nginx: [emerg] location "/x/" cannot be inside the named location "@backend"

Порядок регулярок при вложенности

Сначала спрашиваются регулярки того уровня, где остановился поиск по префиксам, и только потом - уровнем выше. Добавив регулярку во вложенный блок, ты меняешь маршрут для всех адресов внутри этого префикса.

Именованные location

location @fallback {
    proxy_pass http://backend:3000;
}

location / {
    try_files $uri $uri/ @fallback;
}

Именованный блок не участвует в обычном поиске - в него попадают только try_files и error_page. Это способ вынести общий «а если ничего не нашлось» в одно место.

error_page ловит ошибки самого nginx, а не ответ бэкенда: приложение, вернувшее 502, доедет до клиента как есть. Перехват включает proxy_intercept_errors on; - и после него твоя страница заменит ЛЮБУЮ ошибку приложения, включая осмысленные 404.

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

  • Вложенность не сужает поиск. Внутренние блоки сравниваются с полным URI, а не с остатком после префикса. location /cart внутри location /api/ не «не совпадёт» - с ним конфиг вообще не загрузится. Правильно location /api/cart.
  • proxy_pass вложенным блоком не наследуется. Завёл внутри блока с проксированием ещё один location - запросы оттуда пойдут на диск, а не на бэкенд.
  • Три уровня вложенности читаются плохо. Если рябит - разложи маршруты плоским списком (/api/v1/, /api/v2/): длиннее, зато ответ на вопрос «какой блок обработает запрос» виден сразу.

Комментарии

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

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

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