Когда я посещаю несуществующий URL-адрес с расширением .php, я получаю страницу с ошибкой ngnix 404, однако URL-адрес без расширения .php работает, как и ожидалось, с использованием файла try_files. Где 404 обрабатывается через приложение php.
Это произошло с тех пор, как я добавил этот код как предложенный
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
если (!-f $document_root$fastcgi_script_name) {
вернуть 404;
}
Причиной добавления этого было исправление ошибки в журналах: FastCGI отправил в stderr: «Первичный сценарий неизвестен» при чтении заголовка ответа из восходящего потока.
Эта ошибка происходила, когда я посещал файл non-existent.php. Я прочитал много сообщений о проблеме, связанной с отсутствием «SCRIPT_FILENAME», но для меня это было не так.
пример.conf
сервер {
слушать 443 ssl;
слушать [::]:443 ssl;
имя_сервера пример.com;
корень /var/www/example/public/public;
журнал_доступа /var/log/nginx/example.access.log main_ext;
error_log /var/log/nginx/example.error.log предупреждение;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
включить /etc/nginx/include.d/ssl.conf;
# Ларавель
переписать ^/index.php/(.*) /$1 навсегда;
местоположение = / {
try_files /page-cache/pc__index__pc.html /index.php?$query_string;
}
место расположения / {
try_files $uri $uri/ /page-cache/$uri.html /index.php?$query_string;
}
расположение ~ [^/]\.php(/|$) {
включить /etc/nginx/include.d/php.conf;
fastcgi_pass unix:/var/run/php/php8.0-fpm-example.sock;
}
}
php.conf
# Проверяем наличие файла
try_files $uri = 404;
# https://www.nginx.com/nginx-wiki/build/dirhtml/start/topics/examples/phpfcgi/
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
если (!-f $document_root$fastcgi_script_name) {
вернуть 404;
}
fastcgi_index index.php;
# Смягчить https://httpoxy.org/ уязвимости
fastcgi_param HTTP_PROXY "";
fastcgi_intercept_errors выключен;
# включить параметр fastcgi_param
включить fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
Пример URL:
https://example.com/foo - Работает нормально, показывает довольно 404 внутри php-приложения.
https://example.com/foo.php - Показывает ngnix 404 по умолчанию.