Большинство ответов на этот вопрос: установите fastcgi_param SCRIPT_FILENAME, и он будет работать (курсивное форматирование нарушено ?!).
Я установил эту переменную (правильно), но она по-прежнему показывает ошибку вместо страницы 404, потому что корень проблемы здесь:
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
В php5-fpm передается несуществующий путь, который в свою очередь выводит ошибку, которая в журнале выглядит так:
FastCGI sent in stderr:
"Unable to open primary script: ... (No such file or directory)"
while reading response header from upstream
Итак, перед строкой fastcgi_pass
должно быть условие, проверяющее, существует ли файл на самом деле, или, если рабочий fpm возвращает «файл не найден», чтобы заставить nginx вернуть страницу 404.
Как я могу это сделать?
С помощью try_files $uri =404;
первый!
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
Благодаря http://nginxlibrary.com/resolving-no-input-file-specified-error/
В некоторых старых руководствах вы часто найдете что-то вроде этого
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
if (! -f $document_root$fastcgi_script_name) {
return 404;
}
Но, как https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/ заявляет, что вам лучше использовать try_files вместо
Замечание: опасно использовать опубликованную вами конфигурацию без блока if / try_files, потому что при некоторых обстоятельствах он может разрешить выполнение произвольного кода! На самом деле в сети есть много руководств, которые не охватывают этот аспект, поэтому я бы рекомендовал всем проверить, не просто ли их конфигурация работает, но и безопасна.