Как перенаправлять 403 на .php скрипт
Имеется такая конфигурация:
server {
listen 80;
listen [::]:80;
server_name mywebsite.site;
root /var/www/mywebsite.site/public;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php-fpm.sock;
}
}
И пример папки public:
/index.php
/assets/
/assets/img.jpg
Соответственно если я запрашиваю:
mywebsite.site/img.jpg- обрабатываетindex.phpmywebsite.site/assets/img.jpg- получаю картинкуmywebsite.site/assets- то получаю403, т.к. это директория.
Хотелось бы попросить помощи и узнать как 403 ошибку (из-за директории), обрабатывать index.php файлом (как в первом случае), сохраняя урл.
P.S. Хотелось бы универсального решения, без прописывания каждой директории вручную.
Спасибо :)
Ответы (3 шт):
Добавьте следующее:
location ~ ^/.+/ {
try_files $uri $uri/ /index.php;
}
Разобрался:
location / {
try_files $uri $uri /index.php;
}
Надо было убрать / который указывает на проверку директории...
Каждый лишний параметр директивы try_files - это лишний syscall stat(), и вам это точно не надо. И вообще, если можно не использовать директиву try_files - не надо её использовать.
Если вы хотите, чтобы даже обращение к директории без индексного файла перенаправлялось на index.php в корневом каталоге, можно просто задать индексный файл как URI (то есть как путь относительно корневой директории сайта, начинающийся со слеша):
index index.php index.html /index.php;
Если любые запросы, кроме запросов к статическим файлам, должны обрабатываться файлом index.php в корневой директории сайта (каждый дополнительный параметр директивы index - это тоже лишний syscall fstat():
index /index.php;
А самое оптимальное решение с точки зрения производительности - это вместо директивы try_files использовать директиву error_page:
error_page 403 404 = /index.php;
Подробнее на enSO: https://stackoverflow.com/a/62377527/7121513
Важное дополнение:
Следует учитывать, что поведение директив
index <file> [<file>...] <uri>;
(то есть когда хотя бы один индексный файл задан как файл), и
index <uri>;
(то есть когда директива index имеет единственный параметр, заданный в виде URI), немного отличается. Конкретнее, отличаться оно будет в случае получения входящего запроса вида /some/path/ (заканчивающегося слешом, это важно), если этот путь не соответствует физической директории относительно корня веб-сайта. В первом случае nginx проверит существование первого из индексных файлов, обнаружит, что не существует даже сама директория /some/path/, и вернёт ошибку 404 Not Found. Во втором случае такая проверка выполнена не будет, и nginx сразу вернёт содержимое основного индексного файла.