Как настраивать правила yii2 urlManager с псевдонимами и параметром $_GET

для моего текущего (продвинутого) проекта на основе yii2 мне нужен только один контроллер (SiteController). Поэтому нет необходимости показывать его в URL-адресе. Вот почему я добавил это правило в конфигурацию frontend:

'urlManager' => [
    'rules' => array(
        '<alias:product|contact|about>' => 'site/<alias>',
    ),

Это работает отлично, а localhost/product указывает на localhost/сайт/продукт.

Конечно, я активировал prettyUrl и добавил эти правила по умолчанию к общей конфигурации:

 'rules' => array(
                '<controller:\w+>/<id:\w+>' => '<controller>',
                '<controller:\w+>/<action:\w+>/<id:\w+>' => '<controller>/<action>',
                '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
            ),

Теперь я хочу получить доступ к параметру GET следующим образом: localhost/product/productname. Но я получаю ошибку:

Невозможно разрешить запрос "продукт"

но localhost/site/product/productname работает правильно... "Имя продукта" должно быть $_GET ['id']. Что мне нужно изменить, чтобы это произошло?

Спасибо!

Ответ 1

Ваши правила должны быть перед стандартными, и вам нужно 2 правила, например.

'rules' => array(
    '<alias:contact|about>' => 'site/<alias>',
    '<alias:product>/<id:\w+>' => 'site/<alias>',
    '<controller:\w+>/<id:\w+>' => '<controller>',
    '<controller:\w+>/<action:\w+>/<id:\w+>' => '<controller>/<action>',
    '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
),

Ответ 2

Просто определите var в вашем действии, например public function actionProduct($id) и $id was is $_GET['id']