Nginx подстановочный знак / регулярное выражение в пути местоположения

22

Конфиг Nginx, который у меня есть, выдает 404 для .php:

## Any other attempt to access PHP files returns a 404.
location ~* ^.+\.php$ {
    return 404;
}

Однако у меня есть файл index.php в подпапке, который я хочу запустить. Текущая конфигурация выглядит так:

location = /sitename/subpage/index.php {
    fastcgi_pass phpcgi; #where phpcgi is defined to serve the php files
}

location = /sitename/subpage2/index.php {
    fastcgi_pass phpcgi; 
}

location = /sitename/subpage3/index.php {
    fastcgi_pass phpcgi; 
}

это работает отлично, но проблема в дублирующих местоположениях, и если есть много подстраниц, тогда конфигурация становится огромной.

Я попробовал подстановочный знак, такой как *, и некоторое регулярное выражение, которое говорит, что тест nginx пройден, но не загружает страницу, т.е. 404. Что я пробовал:

location = /sitename/*/index.php {
    fastcgi_pass phpcgi;
}

location ~* ^/sitename/[a-z]/index.php$ {
    fastcgi_pass phpcgi;
}

Есть ли какой-нибудь способ, которым я могу иметь какой-либо путь в этом месте как регулярное выражение или подстановочный знак?


источник

Ответы:

32

=Модификатора в locationблоке точное совпадение, без каких - либо групповых символов, сопоставления префикса или регулярных выражений. Вот почему это не работает.

На вашей попытке регулярного выражения, [a-z]соответствует один символ между aи z. Вот почему это не работает для вас.

Вам необходимо настроить ваше местоположение следующим образом. Обратите внимание на порядок locationутверждений. nginx выбирает первое соответствующее условие регулярного выражения.

location ~ ^/sitename/[0-9a-z]+/index.php$ {
    fastcgi_pass phpcgi;
}

location ~ \.php$ {
    return 404;
}

Здесь я использую регистрозависимое соответствие ( ~вместо модификатора ~*). В первом случае я сопоставляю первую часть пути, затем один или несколько буквенных / цифровых символов и затем index.php. Вы можете изменить диапазон совпадений, но помните, что +для «одного или нескольких» повторений.

Второй соответствует любому URI, оканчивающемуся на .php. Вам не нужны дополнительные символы в вашей версии из-за того, как работают регулярные выражения.

Теро Килканен
источник
спасибо, да главное повторение отсутствовало в регулярном выражении. +починил это.
1

Порядок важен из описания местоположения nginx :

Чтобы найти местоположение, соответствующее заданному запросу, nginx сначала проверяет местоположения, определенные с использованием префиксных строк (префиксные местоположения). Среди них местоположение с самым длинным совпадающим префиксом выбирается и запоминается. Затем проверяются регулярные выражения в порядке их появления в файле конфигурации. Поиск регулярных выражений заканчивается при первом совпадении, и используется соответствующая конфигурация. Если совпадения с регулярным выражением не найдено, то используется конфигурация расположения префикса, запомненного ранее.

Это значит:

  • Во- первых =. (соответствие «самый длинный совпадающий префикс»)
  • Тогда неявные. (соответствие «самый длинный совпадающий префикс»)
  • Тогда регулярное выражение. (первый матч)

Вам необходимо настроить порядок частей регулярных выражений.

Хеа-Суан Лин
источник