在用CI框架开发时候,为了使得url美观,且有利于seo,往往需要对url进行重写,这里就用到了URL路由。
在CI的文档中,对于url路由的说明,已经很详细了,只要按照文档的说明进行配置开发,即可对url进行优化。
如:
原来的url地址是:
example.com/class/function/id/
而你希望url变成下面的形式:
example.com/function-1 example.com/function-2 example.com/function-3 example.com/function-4
那么你可以在路由规则定义 application/config/routes.php 文件中,利用 $route 的数组设置你自己的路由规则。
$route['function-(:num)'] = 'class/function/$1';
这样,你就能实现function-1就能访问了。。
路由规则并不是过滤器!设置一个这样的路由:'foo/bar/(:num)' ,Foo 控制器的 bar 方法还是有可能会通过一个非数字的参数被调用 (如果这个路由也是合法的话)。
其实上面的有些多余,因为在CI的手册中已经说的很明白了。那么,这里需要说的是关于路由后的site_url函数。
因为在实际开发过程中,url的结构是随时都可能会变的,改变一次url的规则,我们总不能每个页面都要去改url,这样的工作。。
所以我们需要用url铺助类site_url函数来写我们的url,这样我们才能使url具有良好的“移植性”!
那么:问题来了-----使用site_url函数,生成的url形式是:class/function/id这样的,而我们希望并且已将URL通过“路由”优化成function-id这种形式了。
要解决上面的问题,那么就只能是扩展辅助函数了,即扩展url铺助函数,然后重写site_url方法。
第一步:增加扩展铺助函数文件MY_url_helper.php
在application/helpers/目录下面,新建php文件,MY_url_helper.php文件。
第二步:增加重写文件rewrite.php
在application/config/中,创建一个rewrite.php的文件,主要用来匹配替换url的形式。
代码如下:
//rewrite url $config['pattern']=array(); $config['replace']=array(); $config['pattern'][0] = '/class\/function\//i' $config['replace'][0] = 'function-'
这样写的含义是说,遇到'/class/function/'都通通替换成'function-'。
第三步,在MY_url_helper.php中重写site_url方法。
代码如下:
/* * 调用rewrite的site_url */ if(!function_exists('site_url')) { function site_url($uri = '', $protocol = NULL) { if(function_exists('rewrite')){ $uri=rewrite($uri); } $CI =& get_instance(); return $CI->config->site_url($uri, $protocol); } } //重写url,用于router中优化url //在url辅助函数site_url中调用 if(!function_exists('rewrite')) { function rewrite($url){ $CI=&get_instance(); $CI->config->load('rewrite',TRUE); $rewrite=$CI->config->item('rewrite'); ksort($rewrite['pattern']); ksort($rewrite['replace']); $url=preg_replace($rewrite['pattern'],$rewrite['replace'],$url,1); return $url; } }
这样,就可以在site_url生成url的时候,将相应的路由规则也替换到url里面去了。