我在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