Назад | Перейти на главную страницу

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

Конфигурация 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;
}

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

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

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

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

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

location ~ \.php$ {
    return 404;
}

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

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

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

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

Это значит:

  • Первый =. (совпадение "самый длинный совпадающий префикс")
  • Потом неявные. (совпадение "самый длинный совпадающий префикс")
  • Затем регулярное выражение. (первый матч)

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