“未指定输入文件”的真正解决方案。(nginx,fpm)

“未指定输入文件”的真正解决方案。(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 worker 返回“文件未找到”,则指导 nginx 返回 404 页面。

我怎样才能做到这一点?

答案1

先使用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/

答案2

在一些旧的教程中你经常会发现这样的内容

    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 块是危险的,因为在某些情况下它可能允许执行任意代码!事实上,网上有很多教程没有涉及这方面,所以我建议每个人都检查一下他们的配置是否不仅有效而且安全。

相关内容