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

# конспект · шаг 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/ в блок картинок не попадёт.

Комментарии

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

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

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