<u>复制代码</u> 代码如下: <br><?php echo CHtml::link('错误链接','user/register')?> <br><?php echo CHtml::link('正确链接',array('user/register'))?> <br> <br>假定设定了UrlManager的配置为Path模式,用yii默认的配置: <br><u>复制代码</u> 代码如下: <br>'urlManager'=>array( <br>'urlFormat'=>'path', <br>'rules'=>array( <br>'<w>/<d>'=>'<controller>/view', <br>'<w>/<w>/<d>'=>'<controller>/<action>', <br>'<w>/<w>'=>'<controller>/<action>', <br>), <br>), <br> <br>上面两行代码会生产什么样的链接地址? <br>http://<site-addr>/user/register //错误链接 <br>http://<site-addr>/index.php/user/register //正确链接 <br>第一个链接是错误的,浏览器会返回404错误。第二个链接会访问UserController的Register方法。区别就在于第二个链接在生成的时候我们传入的参数是一个array数组,而第一个方法是一个简单字符串。Yii在处理Url的时候,遇到简单字符串会直接使用该字符串作为最终的Url,而当遇到数组的时候会调用Controller的CreateUrl来生成Url. <br>说到简单字符串,这两个链接中其实有一个非常本质的区别。虽然同样都是字符串'user/register',但是在第一个字符串中就代表一个13个字符的相对路径,而第二个链接中则代表UserController的registerAction,是有着特俗意义的。 <br>附上Yii处理Url的方法NormalizeUrl的源代码: <br><u>复制代码</u> 代码如下: <br>/**<br>* 将输入参数标准化为有效的 URL。 <br>* <br>* 如果输入参数为空字符串,则返回当前请求的URL。 <br>* <br>* 如果输入参数是非空字符串,则被视为有效 URL,并且将 <br>* 不做任何更改地返回。 <br>* <br>* 如果输入参数是一个数组,则将其视为控制器路由和 <br>* GET 参数列表,并且将调用 {@link CController::createUrl} 方法来<br>* 创建一个 URL。在本例中,第一个数组元素指的是控制器路由 <br>*,其余键值对指的是 URL 的附加 GET 参数。 <br>* 例如,<code>array('post/list', 'page'=>3)</code> 可用于生成 URL <br>* <code>/index.php?r=post/list&page=3</code>。 <br>* <br>* @param mix $url 用于生成有效 URL 的参数 <br>* @return string 规范化 URL <br>*/ <br>public static function normalizeUrl($url) <br>{ <br>if(is_array($url)) <br>{ <br>if(isset($url[0])) <br>{ <br>if(($c=Yii::app()->getController())!==null) <br>$url=$c->createUrl($url[0],array_splice($url,1)); <br>else <br>$url=Yii::app()->createUrl($url[0],array_splice($url,1)); <br>} <br>else <br>$url=''; <br>} <br>return $url==='' ? Yii::app()->getRequest()->getUrl() : $url; <br>} <br></site-addr></site-addr></action></controller></w></w></action></controller></d></w></w></controller></d></w>