Приоритет местоположения Nginx

#nginx

Вопрос:

В каком порядке срабатывают директивы о местоположении?

Ответ №1:

Из документов модуля HTTP core:

  1. Директивы с префиксом»=», которые точно соответствуют запросу. Если он найден, поиск прекращается.
  2. Все остальные директивы с обычными строками. Если в этом совпадении использовался префикс»^~», поиск прекращается.
  3. Регулярные выражения в том порядке, в каком они определены в файле конфигурации.
  4. Если #3 дал совпадение, используется этот результат. В противном случае используется совпадение с #2.

Пример из документации:

 location  = / {
  # matches the query / only.
  [ configuration A ] 
}
location  / {
  # matches any query, since all queries begin with /, but regular
  # expressions and any longer conventional blocks will be
  # matched first.
  [ configuration B ] 
}
location /documents/ {
  # matches any query beginning with /documents/ and continues searching,
  # so regular expressions will be checked. This will be matched only if
  # regular expressions don't find a match.
  [ configuration C ] 
}
location ^~ /images/ {
  # matches any query beginning with /images/ and halts searching,
  # so regular expressions will not be checked.
  [ configuration D ] 
}
location ~* .(gif|jpg|jpeg)$ {
  # matches any request ending in gif, jpg, or jpeg. However, all
  # requests to the /images/ directory will be handled by
  # Configuration D.   
  [ configuration E ] 
}
 

Если это все еще сбивает с толку, вот более подробное объяснение.

Комментарии:

1. с этим вам может помочь 🙂 github.com/detailyang/nginx-location-match-visible

2. Обратите внимание , что оба / /documents/ правила и соответствуют запросу /documents/index.html , но последнее правило имеет приоритет, так как это самое длинное правило.

Ответ №2:

Он срабатывает в таком порядке.

  1. = (точно)

    location = /path

  2. ^~ (прямой матч)

    location ^~ /path

  3. ~ (с учетом регистра регулярного выражения)

    location ~ /path/

  4. ~* (регистр регулярных выражений не учитывается)

    location ~* .(jpg|png|bmp)

  5. /

    location /path

Комментарии:

1. ^~ (прямой матч) очень важно

2. Если оставить косую черту в конце, она будет соответствовать более чем точно. #1 должно быть location = /path/ , а остальные должны включать модификаторы начала и конца ( ^ и $ )

3. местоположение = /путь соответствует domain.com/path, и местоположение = /путь/ к domain.com/path/. Другим не нужны модификаторы начала и конца.

Ответ №3:

Теперь есть удобный онлайн — инструмент для проверки приоритета местоположения:
тестирование приоритета местоположения онлайн

Комментарии:

1. Это очень полезно!

Ответ №4:

Местоположения оцениваются в следующем порядке:

  1. location = /path/file.ext {} Точное совпадение
  2. location ^~ /path/ {} Совпадение префикса приоритета -> самый длинный первый
  3. location ~ /Paths?/ {} (регулярное выражение с учетом регистра) и location ~* /paths?/ {} (регулярное выражение без учета регистра) -> первое совпадение
  4. location /path/ {} Совпадение префиксов -> самый длинный первый

Совпадение префикса приоритета (номер 2) совпадает с совпадением общего префикса (номер 4), но имеет приоритет над любым регулярным выражением.

Для обоих типов префиксных совпадений выигрывает самый длинный матч.

Регистр с учетом и без учета регистра имеют одинаковый приоритет. Оценка останавливается на первом правиле сопоставления.

В документации говорится, что все правила префикса оцениваются перед любым регулярным выражением, но если одно регулярное выражение совпадает, то стандартное правило префикса не используется. Это немного сбивает с толку и ничего не меняет в порядке приоритета, указанном выше.