Моя текущая настройка имеет следующую структуру URL
Http://somedomain/блог /1/название
Если часть заголовка slug ошибочна, она будет перенаправляться на правильный слиз, однако, если вы ввели следующий URL-адрес, вы получите 404 (без пули):
Теперь я хочу перенаправить пользователя на правильный URL с помощью slug, например, в 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
по 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],
],
],
],