web-dev-qa-db-ja.com

「入力ファイルが指定されていません」の実際の解決策(nginx、fpm)

この質問に対するほとんどの答えは、set 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ページを返すようにガイドする必要があります。

これどうやってするの?

6
Daniel W.

最初に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/

11
Daniel W.

いくつかの古いチュートリアルでは、このようなものを見つけることがよくあります

    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ブロックなしで投稿した構成を使用するのは危険です。実際、ネット上にはこの側面をカバーしていないチュートリアルがたくさんあるので、構成が機能しているだけでなく、安全でもあるかどうかをすべての人に確認することをお勧めします。

2
justlovingIT