Это очень распространенная проблема с nginx, настроенным для обслуживания приложений PHP, особенно Laravel. Вы можете воспроизвести его на таких сайтах, как laravel.com, например: laravel.com/example.php
.
Конфигурация по умолчанию (которую вы, вероятно, используете в snippets/fastcgi-php.conf
) такова:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
А fastcgi_script_name
является ...
запрос URI или, если URI заканчивается косой чертой, запрос URI с именем файла индекса, сконфигурированного директивой fastcgi_index, приложенной к нему. Эта переменная может использоваться для установки параметров SCRIPT_FILENAME и PATH_TRANSLATED, которые определяют имя сценария в PHP. Например, для запроса «/ info /» со следующими директивами
Это означает, что когда URI запроса содержит .php
, он обрабатывается так, как если бы это был запрос на файл PHP, и если этот файл PHP не существует, nginx возвращает ошибку - он никогда не достигает вашего приложения .
Решение состоит в том, чтобы заставить fastcgi_script_name
всегда равняться точке входа вашего приложения, в данном случае это index.php
. Вы можете отредактировать snippets/fastcgi-php.conf
или добавить его в свой блок местоположения следующим образом:
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
}
Ваше приложение теперь будет получать все запросы, включая те, которые имеют .php
в пути.