Yii2如果只提供了id参数,则重定向到id + slug


Yii2 if only id parameter is provided redirect to id plus slug

我当前的设置有以下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],
        ],            
    ],
],