Подтвердить что ты не робот

Как контролировать порядок соответствия директивы 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, всегда выполняющийся буквальный /. Да, эта оптимизация не будет иметь никакого значения для реальной производительности, но я просто хочу устранить некоторую двусмысленность.

4b9b3361

Ответ 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 работает немного иначе, чем вы могли ожидать.