Я пытаюсь оптимизировать свои директивы «местоположение» и не могу найти хороший способ определить, предпринимается ли даже попытка сопоставления определенного местоположения. Использование echo
внутри блока местоположения здесь не помогает.
Документация NGINX ngx_http_core_module несколько сбивает с толку.
Чтобы использовать регулярные выражения, вы должны использовать префикс:
~
Для сопоставления с учетом регистра
~ *
Для сопоставления без учета регистра
Как выполняется сопоставление:
Директивы с префиксом =
, который точно соответствует запросу. Если найден, поиск прекращается.
Все остальные директивы с обычными строками. Если в этом совпадении использовался префикс ^ ~
, поиск прекращается.
Регулярные выражения в том порядке, в котором они определены в файле конфигурации.
Если # 3 дало совпадение, используется этот результат. В противном случае используется совпадение из №2.
Номер 2 здесь означает «обычные строки», но затем говорит, что его можно использовать с префиксом ^ ~
. Разве ~
не подразумевают регулярное выражение? Если нет, как определить, что не является RegExp?
В частности, мне нужно следующее:
Подавать что-либо из буквального / assets
напрямую. ОСТАНОВИТЬ ПОИСК.
Обслуживать все, что соответствует RegExp \. Php $ | / $
, с помощью быстрого CGI STOP SEARCH.
Обслуживать все остальное напрямую через литерал /
Таким образом, существует только попытка сопоставления /
для нединамических файлов, обслуживаемых извне ресурсов.
У меня есть:
location ^~ /assets {} # search-terminating literal? or regex?
location ~ \.php$|/$ {}
location / {} # is this match always attempted?
Судя по документу, фактический порядок будет 1-3-2, всегда выполняется буквальное совпадение /
. Да, эта оптимизация не повлияет на реальную производительность, но я просто хочу прояснить некоторую двусмысленность.