这个问题的大多数答案是,设置 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返回“file not found”,则引导nginx返回404页面。
我怎样才能做到这一点?
先用
try_files $uri =404;
!感谢http://nginxlibrary.com/resolving-no-input-file-specified-error/
在一些旧教程中,您经常会发现类似这样的内容
但正如https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/所说,您最好改用 try_files
附带说明:使用您发布的配置而不使用 if/try_files 块是很危险的,因为它可以在某些情况下允许执行任意代码!事实上,网上有很多教程没有涵盖这方面的内容,所以我建议大家检查一下他们的配置是否不仅可以工作而且还安全。