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