#nginx
Вопрос:
В каком порядке срабатывают директивы о местоположении?
Ответ №1:
Из документов модуля HTTP core:
- Директивы с префиксом»=», которые точно соответствуют запросу. Если он найден, поиск прекращается.
- Все остальные директивы с обычными строками. Если в этом совпадении использовался префикс»^~», поиск прекращается.
- Регулярные выражения в том порядке, в каком они определены в файле конфигурации.
- Если #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:
Он срабатывает в таком порядке.
=
(точно)
location = /path
^~
(прямой матч)
location ^~ /path
~
(с учетом регистра регулярного выражения)
location ~ /path/
~*
(регистр регулярных выражений не учитывается)
location ~* .(jpg|png|bmp)
/
location /path
Комментарии:
1. ^~ (прямой матч) очень важно
2. Если оставить косую черту в конце, она будет соответствовать более чем точно. #1 должно быть
location = /path/
, а остальные должны включать модификаторы начала и конца (^
и$
)3. местоположение = /путь соответствует domain.com/path, и местоположение = /путь/ к domain.com/path/. Другим не нужны модификаторы начала и конца.
Ответ №3:
Теперь есть удобный онлайн — инструмент для проверки приоритета местоположения:
тестирование приоритета местоположения онлайн
Комментарии:
1. Это очень полезно!
Ответ №4:
Местоположения оцениваются в следующем порядке:
location = /path/file.ext {}
Точное совпадениеlocation ^~ /path/ {}
Совпадение префикса приоритета -> самый длинный первыйlocation ~ /Paths?/ {}
(регулярное выражение с учетом регистра) иlocation ~* /paths?/ {}
(регулярное выражение без учета регистра) -> первое совпадениеlocation /path/ {}
Совпадение префиксов -> самый длинный первый
Совпадение префикса приоритета (номер 2) совпадает с совпадением общего префикса (номер 4), но имеет приоритет над любым регулярным выражением.
Для обоих типов префиксных совпадений выигрывает самый длинный матч.
Регистр с учетом и без учета регистра имеют одинаковый приоритет. Оценка останавливается на первом правиле сопоставления.
В документации говорится, что все правила префикса оцениваются перед любым регулярным выражением, но если одно регулярное выражение совпадает, то стандартное правило префикса не используется. Это немного сбивает с толку и ничего не меняет в порядке приоритета, указанном выше.