CodeIgniter的url重写

发布时间:2016-04-12 浏览次数:4001 文章来源:个人博客

在用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里面去了。


key-word
CI 路由 CI重写url CI的site_url适应路由 CI site_url按路由规则重写 CI链接生成支持路由规则