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