Конфигурация 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 сначала проверяет местоположения, определенные с помощью строк префикса (местоположения префиксов). Среди них выбирается и запоминается место с самым длинным совпадающим префиксом. Затем проверяются регулярные выражения в порядке их появления в файле конфигурации. Поиск регулярных выражений завершается при первом совпадении, и используется соответствующая конфигурация. Если совпадения с регулярным выражением не найдено, используется ранее запомненная конфигурация расположения префикса.
Это значит:
=
. (совпадение "самый длинный совпадающий префикс")Вам нужно настроить порядок частей регулярного выражения.