Как управлять порядком соответствия директивы NGINX «Location»?

Я пытаюсь оптимизировать свои директивы «местоположение» и не могу найти хороший способ определить, предпринимается ли даже попытка сопоставления определенного местоположения. Использование echo внутри блока местоположения здесь не помогает.

Документация NGINX ngx_http_core_module несколько сбивает с толку.

Чтобы использовать регулярные выражения, вы должны использовать префикс:

  1. ~ Для сопоставления с учетом регистра

  2. ~ * Для сопоставления без учета регистра

Как выполняется сопоставление:

  1. Директивы с префиксом = , который точно соответствует запросу. Если найден, поиск прекращается.

  2. Все остальные директивы с обычными строками. Если в этом совпадении использовался префикс ^ ~ , поиск прекращается.

  3. Регулярные выражения в том порядке, в котором они определены в файле конфигурации.

  4. Если # 3 дало совпадение, используется этот результат. В противном случае используется совпадение из №2.

Номер 2 здесь означает «обычные строки», но затем говорит, что его можно использовать с префиксом ^ ~ . Разве ~ не подразумевают регулярное выражение? Если нет, как определить, что не является RegExp?

В частности, мне нужно следующее:

  1. Подавать что-либо из буквального / assets напрямую. ОСТАНОВИТЬ ПОИСК.

  2. Обслуживать все, что соответствует RegExp \. Php $ | / $ , с помощью быстрого CGI STOP SEARCH.

  3. Обслуживать все остальное напрямую через литерал /

Таким образом, существует только попытка сопоставления / для нединамических файлов, обслуживаемых извне ресурсов.

У меня есть:

location ^~ /assets {}      # search-terminating literal? or regex?
location ~ \.php$|/$ {}
location / {}               # is this match always attempted?

Судя по документу, фактический порядок будет 1-3-2, всегда выполняется буквальное совпадение / . Да, эта оптимизация не повлияет на реальную производительность, но я просто хочу прояснить некоторую двусмысленность.

17
задан Mogsdad 2 May 2016 в 13:26
поделиться