# конспект · шаг 5 из 5
Конспект: выбор location
Решение №2: какой location внутри выбранного сервера обработает запрос.
Пять форм
location = /favicon.ico { } # точное совпадение всего URI
location ^~ /images/ { } # префикс, отменяющий регулярки
location ~ \.php$ { } # регулярка, с учётом регистра
location ~* \.(jpg|png)$ { } # регулярка, без учёта регистра
location /api/ { } # обычный префикс
Алгоритм целиком
1. Есть location "=" с точно таким URI?
да → он победил, поиск окончен
2. Найти самый длинный совпавший префикс и ЗАПОМНИТЬ его
(обычный и ^~ участвуют оба)
3. Запомненный префикс объявлен с ^~ ?
да → он победил, регулярки не проверяются
4. Проверить регулярки СВЕРХУ ВНИЗ, первая совпавшая побеждает
5. Регулярки не совпали → побеждает запомненный префикс
Отсюда главное: порядок в файле решает только споры между регулярками. Для префиксов важна длина, а не положение.
Ловушки джокера
- Префикс - это строка, а не путь.
location /appсовпадёт и с/application.log, и с/appliance. Имелся в виду каталог - пиши слеш:location /app/. - Регулярка бьёт длинный префикс.
location /images/иlocation ~ \.png$- запрос/images/logo.pngуйдёт в регулярку. Не нужно этого - ставь^~. location = /не то же самое, чтоlocation /. Первое ловит ровно главную страницу, второе - вообще всё.- Из двух регулярок побеждает не более точная, а написанная выше.
~ ^/api/над~ ^/api/v2/делает второй блок мёртвым, и никакой ошибки при этом нет. - Сравнивается нормализованный URI, а не то, что прислал клиент: строка
запроса отрезана,
%2eраскодированы,..схлопнуты, двойные слеши склеены. Поэтому/images/../secret/в блок картинок не попадёт.
Комментарии
Пока нет комментариев. Будь первым!
Оставить комментарий