最近买了台海外的vps做***,使用一键lnmp后改了一下nginx的配置文件,测试php页面发现返回“No input file specified”,查站点日志报错如下
nginx报错“No input file specified”
状态码是404,提示找不到该文件,但在站点目录下确实有index.php文件,且提示是在access日志里, 所以是php_cgi找不到php文件。
修改php的主配置文件php.ini,修改cgi.fix_pathinfo=0为cgi.fix_pathinfo=1,开启cgi解析,然后修改nginx的主配置文件nginx.conf,修改fastcgi_param SCRIPT_FILENAME ;字段为
fastcgi_param SCRIPT_FILENAME$document_root$fastcgi_script_name;
到此访问php文件正常。
之前一直百度方法,发现文章都差不多,后面×××谷歌才查到解决方法。
这里开启cgi.fix_pathinfo是为CGI提供pathinfo功能,但开启后的弊端是,可以通过利用请求php文件来获取图片文件代码,然后将恶意代码伪装成图片上传(前提是网站可以上传图片)。
设置nginx.conf文件fastcgi_param SCRIPT_FILENAME$document_root$fastcgi_script_name,这里的$document_root意思是php脚本文件的请求目录为站点根目录。
fastcgi_param参数详解:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;#脚本文件请求的路径
fastcgi_param QUERY_STRING $query_string; #请求的参数;如?app=123
fastcgi_param REQUEST_METHOD $request_method; #请求的动作(GET,POST)
fastcgi_param CONTENT_TYPE $content_type; #请求头中的Content-Type字段
fastcgi_param CONTENT_LENGTH $content_length; #请求头中的Content-length字段。

fastcgi_param SCRIPT_NAME $fastcgi_script_name; #脚本名称
fastcgi_param REQUEST_URI $request_uri; #请求的地址不带参数
fastcgi_param DOCUMENT_URI $document_uri; #与$uri相同。
fastcgi_param DOCUMENT_ROOT $document_root; #网站的根目录。在server配置中root指令中指定的值
fastcgi_param SERVER_PROTOCOL $server_protocol; #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。

fastcgi_param GATEWAY_INTERFACE CGI/1.1;#cgi 版本
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;#nginx 版本号,可修改、隐藏

fastcgi_param REMOTE_ADDR $remote_addr; #客户端IP
fastcgi_param REMOTE_PORT $remote_port; #客户端端口
fastcgi_param SERVER_ADDR $server_addr; #服务器IP地址
fastcgi_param SERVER_PORT $server_port; #服务器端口
fastcgi_param SERVER_NAME $server_name; #服务器名,域名在server配置中指定的server_name

#fastcgi_param PATH_INFO $path_info;#可自定义变量

#fastcgi_param REDIRECT_STATUS 200;