Как контролировать порядок соответствия директивы NGINX "Расположение"?
Я пытаюсь оптимизировать свои директивы "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, всегда выполняющийся буквальный /
. Да, эта оптимизация не будет иметь никакого значения для реальной производительности, но я просто хочу устранить некоторую двусмысленность.
Ответы
Ответ 1
Из wiki:
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 ~ \.php$ {}
Даже если активы обслуживаются из location / {}
Внутри php-блока вы также хотите защитить от вредоносных загрузок до перехода на fastcgi:
if ($uri ~* "^/uploads/") {
return 404;
}
Как вы можете видеть, nginx работает немного иначе, чем вы могли ожидать.