Вы можете использовать UrlManager::$enableStrictParsing
, чтобы отключить сопоставление по маршруту.Если вы установите true
, запрос к /site/index
URL не будет ничего совпадать, и приложение вернет ошибку 404.
'components' => [
'urlManager' => [
'baseUrl' => '',
'enablePrettyUrl' => true,
'showScriptName' => false,
'enableStrictParsing' => true,
'rules' => [
'search' => 'site/index',
// ...
],
// ...
Но это может быть не вариант, если вы действительно хотите использовать маршруты какURL в других случаях.
Вас также может заинтересовать класс UrlNormalizer
.Это все еще относительно простой компонент, который (пока) не поддерживает ваш вариант использования, но на самом деле он был разработан для таких задач.Вы можете рассмотреть возможность его расширения и добавить логику перенаправления для вашего варианта использования - это должно быть гораздо более чистое решение, чем использование событий или специальных действий и правил для перенаправлений.Это также может быть хорошим материалом для PR и передачи этой функции в базовую платформу.
Ленивое решение заключается в создании действия перенаправления и добавлении правил в соответствии с URL-адресами, которые необходимо перенаправить:
class RedirectController extends Controller {
public function actionRedirect($action, $controller, $module = null) {
if ($action === $this->action->id && $controller === $this->id && $module === null) {
// prevent to access action directly and redirection loops
throw new NotFoundHttpException();
}
$url = Yii::$app->request->get();
unset($url['action'], $url['controller'], $url['module']);
array_unshift($url, '/' . ltrim(implode('/', [$module, $controller, $action]), '/'));
return $this->redirect($url);
}
}
И правила:
'urlManager' => [
// ...
'rules' => [
'search' => 'site/index',
[
'pattern' => '<controller:(site)>/<action:(index)>',
'route' => 'redirect/redirect',
'model' => UrlRule::PARSING_ONLY,
],
// ...
],
],