我在stackoverflow和yii论坛上到处搜索,有很多答案,
这对我没有帮助…
这是我的案子。
我有一个名为:proj的控制器和一个名为view的操作。
它得到:id(int)、name(string)。
所需的名称有时带有特殊字符,如:[+,!γ-$%^和*-]
所以当我运行createUrl()函数时,它会返回我不太友好的URL。
例如:
http://www.qa-mysite.com/proj/1029/Conservation+of+the+Vermont+Salt+Pan+System%2C+Hermanus%2C+South+Africa
ID=1029
名称=佛蒙特州盐田系统保护,赫曼努斯,南非。
我希望结果是:
http://www.qa-mysite.com/proj/1029/conservation-of-the-vermont-salt-pan-system-hermanus-south-Africa
所以实际上我需要去掉特殊字符,并将空格之间的分隔符改为“-”,而不是“+”。
我目前对curlmanager的配置是:

'urlManager'=>array(
            'urlFormat'=>'path',
            'showScriptName'=>false,
            'appendParams' => true,
            'rules'=>array(
            //array('proj/view/<name:\w+>', 'pattern'=>'proj/<id:\d+>'),
                //'<controller:\w+>/<id:\d+>'=>'<controller>/view',
                'proj/<id:\d+>/<name:\w+>'=>array('proj/view', 'caseSensitive'=>false),
                '<controller>/<id:\d+>/<name:.*?>'=>'<controller>/view',
                '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
                '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
            ),
        )

createURL示例:
$this->createUrl('proj/view', array('id' => $data->id, 'name' => $data->name));

在网址将被改变后,我需要做301重定向到新的搜索引擎优化友好的旧网址。
注意:我不能做硬编码str_replace。
非常感谢您的帮助:]

最佳答案

通过对CUrlManager和ovveridecreateUrl进行子类化,创建自己的url管理器,例如:

class MyUrlManager extends CUrlManager {
    public function createUrl($route,$params=array(),$ampersand='&') {
        if($route == 'proj/view' && isset($params['name'])) {
            $params['name'] = processYourParamFunction($params['name']);
        }
        return parent::createUrl($route,$params,$ampersand);
    }
}

然后修改配置以使用此类:
...
'urlManager' => [
    'class' => 'MyUrlManager'
...
]

这是一个伟大的yii功能,自然inversion of control:)
关于问题的第二部分:
在视图中,如果检测到不需要的字符,操作只需重定向到带有createurl的新url。只要确保你没有点击重定向循环。
更新:
要使用301重定向,只需传递重定向代码第三个参数来重定向调用:
$this->redirect('route', true, 301);

边注:
使用cannonical将搜索引擎指向正确的url

09-27 12:14