如果你在使用Nginx和php-cgi,在按照一些标准流程安装后,可能会遇到“No input file specified”这样子的错误提示。这种错误通常发生在php-cgi进程无法找到“.php”文件或者执行“SCRIPT_FILENAME”传过来的参数。这篇文章讨论发生这种错误的几个原因和解决方法。
(1)错误的路径
通常而言,文件路径(SCRIPT_FILENAME)设置错误,以致fastCGI进程无法解析。在多数案例中,主要由于Nginx配置 错误造成。很多配置如下:
server {
listen [::]:80;
server_name example.com www.111cn.net;
access_log /var/www/logs/example.com.access.log;
location / {
root /var/www/example.com;
index index.php index.html index.htm;
}
location /images {
autoindex on;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/example.com$fastcgi_script_name;
include fastcgi_params;
}
}
这个配置中有写地方是错误的。一个明显抓人眼球的错误就是 root 指明“location /”内,当根目录root被定义在这个“location”内,它只是在当前快内生效。而这里的“location /images”这个块就不会适用于其他请求因为它没有被定义在“$document _root”之中。对它来说,设定根目录root就显得多余了。通常,根目录root应该从“location /”移出至“server”块内。这样子,location块就可以继承“server”块中定义的值。当然,如果你想为一个“location”位置定义一个不同的“$document_root”,你可以在根目录“location /”指定一个位置指向。
另一个原因是fastCGI参数“SCRIPT_FILENAME”的值被写死了。如果我们更改的根路径的指向,而这里的值未相应更改,那么php-cgi将返回“No input file specified”的错误,因为它确实无法在写死的路径那里找到找到相应的文件。所以,我们应该这样子设定“SCRIPT_FILENAME”:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
我们应该记住应该在server块内指明根目录。
(2)未正确设置权限
未正确设置根目录的权限。
(3)使用Open Basedir严格限制路径
如果在php.ini严格限制了PHP文件的路径,即使nginx配置正确,也有可能会出现如上错误提示。需要修改php.ini中的“open_basedir =”的值与指定的根目录一致,
(4)文件不存在
确保文件存在。