我当前的设置具有以下网址结构
http://somedomain/blog/1/title
如果slug标题部分错误,它将重定向到正确的slug但是如果您输入以下url,则会得到404(没有提供slug):
现在我想用slug将用户重定向到正确的URL,例如在stackoverflow上如果输入https://stackoverflow.com/users/1917403,如果将我的用户名添加到最后。
网址管理员
'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,
]);
}
答案 0 :(得分:1)
由于未找到slug,因此您创建的规则不匹配。它会绕过它。
因此,您可以使用defaults
-functionality作为规则,使其中一个参数(在本例中为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],
],
],
],