有人用做过和处理过friendly-url的吗?

rt,其实之前我也已经提过这个问题了关于url friendly的问题,不过没人回答 -_-!

真的很想知道具体的流程是怎么样的,我那个帖子里面的方法太弱智了。。。

我看 FlexicaCMS 里面的代码,它里面都不知道怎么跳的。囧。。。。

FlexicaCMS用自己的Url类继承CUrlManager来处理访问的路径的,然后就不知道怎么做了 :(

Help me, please…

PS:不得不赞一句,今天再次上stay.com看了一下它的功能,真的做的很好!如果能开源出来就更好了,哈哈~~~

stay.com用的都是现有CUrlManager所支持的。其实用法很简单,比如你想同时拥有/help(指向site/help action)和/beijing(指向city/view action),那么写以下两条规则就可以了:




'<action:(help|about|....)>' => 'site/<action>',

'<name:\w+>' => 'city/view',



注意city/view规则必须放在最后,因为它会匹配大部分url

qiang哥,请恕我比较笨,这个是我修改yii blog的,




'rules'=>array(

                'posts/<tag:.*?>'=>'post/index',

                '<controller:\w+>'=>'<controller>',

        		'<controller:\w+>/<action:\w+>'=>'<controller>/<action>',

                '<module:\w+>/<controller:\w+>/<action:\w+>'=>'<module>/<controller>/<action>',

                '/'=>'post',

                '<titile:.*?>'=>'post/view',

        ),



如果用上你的方法,把


'<titile:.*?>'=>'post/view',

改为


'<titile:\w+>' => 'post/view'

就调用不到post/view了。

当然,我知道你应该还会在city/view里面对这个url进行处理的,是类似这样处理吗?




$arrUrl = explode('/', Yii::app()->request->url);

$title = urldecode($arrUrl[count($arrUrl)-1]);

        

$criteria = new CDbCriteria;

$criteria->condition = "title = '".$title."'";

$criteria->limit = 1;

$model = Post::model()->find($criteria); 



还有一个问题哦,就是像qiang哥你这样做


'<name:\w+>' => 'city/view'

如果rules前面没有访问其它的controller规则的话,那岂不是几乎所有余下的请求都是跑 city/view ?

\w+匹配的只能是word character。这也是为什么你这样改不起作用的原因。

比较正规的做法是在post表里添加一个url_name列。当保存一个post时,用title生成对应的url_name。这个url_name必须正规化过(例如空格用-替代,去除非法字符等)。这样,在actionView里你就可以通过查询url_name获得对应的post了,而你在生成url的时候,需要用createUrl(‘post/view’, array(‘title’=>slugify($model->title)))里来生成,这里slugify就是你自己写的正规化title的函数。

你可以参看(http://www.yiiframework.com/wiki/53/using-search-engine-and-user-friendly-urls#hh2)进一步优化你的代码。

我们把city/view的规则放在最后就是为了让其它rule先有机会处理。一般来说,你可以在这之前放一个:’<controller:\w+>/<action:\w+>’ => ‘<controller>/<action>’

这样一般的news/index之类的url就可以处理掉了。