已解决
对于/index.php/abc这种url,Apache和Lighttpd会按”index.php?abc”来解释,而nginx会认为是请求名
字是“index.php”的目录下的abc文件的内容。所以CI在nginx下不配置rewrite是无法运行的,而在Apache
和Lighttpd则正常。
Nginx里rewrite ^/(.*)$ /index.php?$1 last;来rewrite请求时,对于:/abc.abc这类请求,会
rewrite成“index.php/abc_abc”,即会把“点”变成“下划线”,不清楚是为什么。
Nginx配置文件里的rewrite规则不是只执行一次就完事的,是“执行一遍,假如没有碰到break,就按
rewrite后的新路径再执行一遍,直到不再变化或者遇到break或者执行满10次报500错误退出”,所以单纯
的用小知识二里的重写规则是不行的,需要在后面加上一句break,这样重写一遍后就不再执行了。
其中fireboxbug指的是codeignite所在的子目录。
location /firefoxbug/
{
index index.php;
if (!-e $request_filename) {
rewrite ^/(.*)$ /firefoxbug/index.php?$1 last;
break;
}
}
分割线---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
简单记录一下ci伪静态
首先需要设置nginx 开启 path_info (这一点我纠结了好久,按照网上方法设置都不正确,最终发觉lnmp默认已经开启path_info)
伪静态规则:
if ($request_uri ~* ^/system)
{
rewrite ^/(.*)$ /index.php?/$1 last;
break;
}
if (!-e $request_filename)
{
rewrite ^/(.*)$ /index.php?/$1 last;
break;
}
资料:codeigniter-nginx-rewrite-rules
nginx rewrite 伪静态配置参数详细说明(转)
最近将一个CI框架的项目部署到Nginx服务器上时,连接到控制器的页面全部出现404错误。查询资料后发现,CI框架主要应用与apache服务器,CI框架需要path_info的支持,Nginx服务器需要经过配置才能实现path_info。
从网上搜索后找到如下配置,测试正常。
找到对应配置文件,修改为:
server
{
listen 80;
server_name localhost;
index index.php;
root /home/wwwroot; #修改为项目对应的根目录
location ~ .*.php($|/)
{
root /home/wwwroot; #修改为项目对应的根目录
fastcgi_param SCRIPT_FILENAME /home/wwwroot$fastcgi_script_name;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
include fastcgi_params;
fastcgi_pass unix:/tmp/php-fcgi.sock;
fastcgi_index index.php;
}
}
此外还要找到php.ini(/usr/local/php/etc/php.ini)的配置文件(若不修改,会出现No input file specified问题)
搜索关键词:cgi.fix_pathinfo
将此设置为1:
cgi.fix_pathinfo=1
最后重启Nginx即可。
此外若目录中出现”.”,也可能遇到404问题。(没遇到过,网上搜资料的时候找到的)
参考的网站如下:
http://cc.ecjtu.net/posts/ci-nginx-404
http://down.chinaz.com/server/201111/1358_1.htm
http://codeigniter.org.cn/forums/thread-1465-1-1.html
http://wesoho.blog.51cto.com/715082/200689
感谢大家的分享。
虚拟机测试nginx 遭遇 No input file specified,多方查找终于找到解决办法
1、 php.ini(/etc/php5/cgi/php.ini)的配置中这两项
cgi.fix_pathinfo=1 (这个是自己添加的)