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;
于是再次度娘。。。(不要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了。。。
刷新页面,成功了?!噢耶
这时候你需要注意配置文件中的下方这行语句
fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
将其修改为
fastcgi_param SCRIPT_FILENAME D:/sky/www$fastcgi_script_name;
其中
D:/sky/www
为你应用的根目录
重启Nginx,应该就没问题了
