Назад | Перейти на главную страницу

реальное решение для `Входной файл не указан` (nginx, fpm)

Большинство ответов на этот вопрос: установите 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, потому что при некоторых обстоятельствах он может разрешить выполнение произвольного кода! На самом деле в сети есть много руководств, которые не охватывают этот аспект, поэтому я бы рекомендовал всем проверить, не просто ли их конфигурация работает, но и безопасна.