今天在把ci项目放到服务器上的时候,死活路由不到页面,要么是404,要么都是welcome页面,很烦。到网上搜到一大堆方法,大多不全面或者不好使,有的干脆就一行代码,我也是看不懂。刚刚弄了好几个小时,总算路由到页面了。这里mark一下。服务器环境
Debian 9.0 64位
nginx 1.13.5
PHP/7.1.10
CodeIgniter 3.1.6
nginx 报404错误的原因
原因是默认Nginx不支持pathinfo这种格式,当你浏览器里输入http:xxx.xxx.comindex.phppageshome的时候,Nginx会认为你要访问index.php目录下的pages文件夹里的home,所以会报404 not found错误。
解决方法
解决方法就是修改nginx.conf
文件,下面是我的配置:
location / {
root html;
index index.html index.htm;
try_files $uri $uri/ /index.php;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /$document_root$fastcgi_script_name;
include fastcgi_params;
}
主要就是加了一行 try_files $uri $uri/ /index.php;
具体的原理我也不是很懂,大致就是重定向之类的,懒得走进科学,反正我知道添加这一行,就好用了。
然后修改php支持pathinfo ,找到php的php.ini文件(可能在php安装目录的etc目录也可能在lib文件夹下,看自己的配置),搜索:cgi.fix_pathinfo
将注释放开,并置为1:cgi.fix_pathinfo=1
然后在CI的application 下的config/config.conf文件里修改三个参数:
$config['base_url'] = 'http://1.abc.com/';
$config['index_page'] = '';
$config['uri_protocol'] = 'REQUEST_URI';
这三个参数比较关键,其中第一个是web根目录对应的域名 ,index_page要为”,不要为默认值 ‘index.php’.
经过以上设置就ok了,url地址里不需要写index.php了。
然而在我的项目里,nginx路由虽然不报错了,但是ci还是报错404,最后发现是文件名大小写的问题,真的很坑。
控制器的文件名称不能小写。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。