Sivo 悉见

nginx不支持pathinfo导致thinkphp无法正常运行的解决方案

匿名 · 更新于 2015/1/15

最近做了一个新网站,用的是ThinkPHP,租了一个阿里云ECS,用官方提供的一键安装web环境后,发现装的是nginx服务器(之前一直用的是Apache),这个东东对我来说还是很新鲜的(汗~~),去百度了一下,发现nginx前景不错啊,据说有和Apache媲美甚至更甚一筹的可能。于是开始按照官方的说明,配置服务器,上传网站,打开网站测试首页,一切正常!但是当我点击链接的时候就发现不妙了,我进入一个类似这样的url页面,
http://127.0.0.1/index.php/Admin
结果发现nginx提示404错误,错误截图如下:

后来百度了一下,才知道Nginx不支持ThinkPHP的原因。。。

nginx不支持thinkphp的原因
ThinkPHP支持通过PATHINFO和URL rewrite的方式来提供友好的URL,只需要在配置文件中设置 'URL_MODEL' => 2 即可。在Apache下只需要开启mod_rewrite模块就可以正常访问了,但是Nginx中默认是不支持PATHINFO的,所以nginx默认情况下是不支持thinkphp的。不过我们可以通过修改nginx的配置文件来让其支持thinkphp。

让nginx支持pathinfo,支持thinkphp
我们打开nginx的配置文件,如果是想某个站点支持,请打开对应站点的配置文件(我这里是phpwind.conf),将如下图红框所示部分注释掉,我们将对这部分进行重写!


将重写后的代码添加进去

添加部分的代码如下:

 

location ~ \.php {
		fastcgi_pass 127.0.0.1:9000;
		fastcgi_index index.php;
		include fcgi.conf;
		set $real_script_name $fastcgi_script_name;
		if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
			set $real_script_name $1;
			set $path_info $2;
		}
		fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
		fastcgi_param SCRIPT_NAME $real_script_name;
		fastcgi_param PATH_INFO $path_info;
}

完整phpwind.conf下载
接下来就是上传配置文件,重启nginx,隐隐觉得又到了见证奇迹的时刻!
但是。。。乐极生悲了。。。我的nginx重启失败了,提示如下:
 

nginx: [emerg] open() "/alidata/server/nginx/conf/fcgi.conf" failed (2: No such file or directory) 
in /alidata/server/nginx/conf/vhosts/phpwind.conf:18


似乎(英语很烂。。。谅解)是在告诉我,phpwind.conf第18行出错了(以前apache错误也是这样蒙的。。),我去看了下phpwind.conf的第18行,发现是这一句

include fcgi.conf;
结合上下文,发现意思就是fcgi.conf这个文件没有找到了。。。
于是再次度娘。。。(不要BS我。。。Google真的打不开,懒得翻墙了。。。)
度娘显灵,我居然找到了我需要的fcgi.conf这个文件,现在提供给大家下载吧
conf/vhosts
http://zl.hwpan.com/u53343564/docimg%2F52%2Ffcgi.conf
下载后,将fcgi.conf上传到nginx下conf目录下,我配置的时候发现网站的配置文件(也就是刚才咱们重写的那个文件)在nginx/conf/vhosts目录下,而fcgi.conf需要上传到
nginx/conf目录下
然后再次重启nginx,期待ing...

果然不出所料,又一次出现了错误信息。。。这次出现的是下面这个错误:
No input file specified.

我不太确定这是什么问题,有点蒙圈了。。。只好再次度娘
后来找了很多都不起效,最后发现了以下这个解决方案。。。突然发现得来全不费工夫啊

更改php.ini
首先php.ini的配置中把
;cgi.fix_pathinfo=0
改为
cgi.fix_pathinfo=1

最后再次重启nginx服务器,有点累觉不爱的感觉。。。我暗暗下定决心,这次如果还不成功我就要用apache了。。。
刷新页面,成功了?!噢耶
 
PS:如果按照上边修改后,依然提示 No input file specified.
这时候你需要注意配置文件中的下方这行语句
fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;

将其修改为
fastcgi_param  SCRIPT_FILENAME  D:/sky/www$fastcgi_script_name;
其中

D:/sky/www
为你应用的根目录
重启Nginx,应该就没问题了