Не отрабатывает правило url в rules

На сайте везде используются человекопонятные URL. Но понадобилось сделать один URL, параметры в который будут передаваться через знак вопроса и ампераснды.

Пример кода:




        'urlManager'=>array(

            'urlFormat'=>'path',

            'showScriptName'=>false,

            'rules'=>array(

                'page<page:\d+>'=>'site/showpage',

                'news<news:\d+>'=>'site/shownews',

                'abc?id=<userId:\d+>&key=<secretKey:[a-z]+>'=>'site/abc',

                'blog<post:\d+>'=>'site/showpost',

            ),

        ),



Если использовать createUrl(), чтобы создавать URL, тогда правило отрабатывает нормально. При вызове


Yii::app()->createUrl('site/abc', array('userId'=>123, 'secretKey'=>'secret',));

генерится URL: /abc?id=123&key=secret

Но вот при открытии страницы site.ru/abc?id=123&key=secret правило уже не отрабатывает.

Можно правда переписать правила следующим образом




        'urlManager'=>array(

            'urlFormat'=>'path',

            'showScriptName'=>false,

            'rules'=>array(

                'page<page:\d+>'=>'site/showpage',

                'news<news:\d+>'=>'site/shownews',

                'abc?id=<userId:\d+>&key=<secretKey:[a-z]+>'=>'site/abc',

                'abc'=>'site/abc',

                'blog<post:\d+>'=>'site/showpost',

            ),

        ),



тогда при вызове site.ru/abc?id=123&key=secret сработает второе правило для abc и в actionAbc() нужно будет самому проверить $GET[‘id’] и $GET[‘key’], но это немного не красиво что-ли, да и не удобно.

Вопросы:

  1. Почему не отрабатывает правило в первом случае?

  2. Как сделать, чтобы работало правило (как в первом коде я указал)?

Во-первых, при воспроизведении вашего примера $id и $key содержат передаваемые в $_GET значения, т.ч. не понятно, почему вы пишете

[size="2"][color="#1c2837"]

[/color][/size]

[size="2"] [/size][size="2"][color="#1c2837"]По поводу первого вопроса[/color][/size]


if(preg_match($this->pattern.$case,$pathInfo,$matches)) 

CUrlManager, line 819 возвращает ноль.

Ноль возвращает потому, что $pathInfo содержит строку, обрезанную до знака "?" - CHttpRequest, line 357

По поводу второго вопроса - у меня нет готового решения (если не считать вашего рабочего второго примера) , я бы начала с изучения кусков кода, обознaченных выше.