我当前的设置有以下URL结构
http://somedomain/blog/1/title如果标签标题部分是错误的,它将重定向到正确的标签,但如果你输入以下url,你会得到一个404(没有提供标签):
http://somedomain/blog/1现在我想把用户重定向到正确的URL,例如在stackoverflow上,如果你输入https://stackoverflow.com/users/1917403,它会把我的用户名添加到末尾。
Url经理
'urlManager' => [
'class' => 'yii'web'UrlManager',
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
'blog/<id:'d+>/<slug:[-a-zA-Z 0-9]+>' => 'blog/view',
],
],
这里是控制器视图动作
public function actionView($id, $slug = null)
{
$model = $this->findModel($id);
$model->author_info = json_decode($model->author_info, true);
if ($slug != $model->slug) {
return $this->redirect(['blog/view', 'id' => $id, 'slug' => $model->slug]);
}
return $this->render('view', [
'model' => $model,
]);
}
您创建的规则不匹配,因为没有找到段符。它会直接绕过它。
因此,您可以使用规则的defaults
-功能使其中一个参数(在本例中为slug)成为可选的,或者只是指定第二个不包含slug部分的规则。
解决方案1的示例如下:
'urlManager' => [
'class' => 'yii'web'UrlManager',
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
[
'pattern' => 'blog/<id:'d+>/<slug:[-a-zA-Z 0-9]+>',
'route' => 'blog/view',
'defaults' => ['slug' => null],
],
],
],