首先我使用的是Nginx的URL rewrite的方法。
开启enable_query_strings
开启方法很简单:在application/config/config.php中设置:
$config['enable_query_strings'] = FALSE;
在CI开发的项目中用的PATH_INFO模式,要在Nginx配置中重写URL,那么就要在CI的配置文件中开启字符串查询,对比URL形式的变化:
URL:www.xxx.com/user/profile 字符串查询模式:www.xxx.com/index.php?c=user&m=profile
把前台和后台的URL按照一定规则重写之后,测试都OK。但是在分页的时候出点问题,因为在开启字符串查询之后生成的分页URL地址有变化:
未开启:/user/list/10 开启字符串查询之后:/user/list&per_page=10
之所以会出现下面错误的URL是我在生成分页的时候,base_url格式没有变化,那么从/user/list变成对应的/index.php?c=user&m=list之后就会变成下面情况:
第二页:www.xxx.com/index.php?c=user&m=list&per_page=10 第三页:www.xxx.com/index.php?c=user&m=list&per_page=20 第四页:www.xxx.com/index.php?c=user&m=list&per_page=30
而我设置的pagesize一直都是10,这样的话per_page应该一直是10的。去看一下Pagination这个类的代码,发现per_page只是query_string_segment的默认值,我误以为是per_page这个参数了。
分页兼容rewrite
总结一下分页这块如果要兼容rewrite的写法,那么就在生成分页的时候改变一下base_url参数:
方法一:/index.php?c=user&m=list,结果是:/index.php?c=user&m=list&per_page=10 方法二:/user/list?,结果是:/user/list?&per_page=10
分页的SQL就是:
$this->db->limit($pagesize, $this->input->get('per_page'));
为了保持URL一致性还是使用第二种方法,后面也可以随便加个没用的参数让结果变成/user/list?x=xxx&per_page=10。
讨论
关于分页。当然也可以不使用CI自带的分页,或者把Pagination.php改一改。
如果是作为method的一个参数传递的时候,正常URL如:/user/arg1/arg2/arg3,那么在rewrite的时候就没法传递过去了(至少我还没找到解决的方法),要想解决除非把参数变成GET方式传递,这就要改动程序了,所以不推荐。
而且使用rewrite就要针对不同形式的URL,如果项目很复杂的话就成了累赘,所以就寻求另外一种方法:让Nginx把PATH_INFO传递给fastcgi,见下一篇文章吧。
以上就是Nginx配置CodeIgniter项目(一)的内容,更多相关内容请关注PHP中文网(www.php.cn)!