Смотрите как это просто -- нужен лишь роутер.
Вы пишете любые свои правила на ваш мега контроллер BaseController. Например:
'about' => 'base/about',
'contacts' => 'base/contacts'
...
Но в самом низу роутера добавляете что-то типа:
'<dir1:[\w\-\_\d]+>/<dir2:[\w\-\_\d]+>' => 'base/page',
'<dir1:[\w\-\_\d]+>' => 'base/page'
Эти два правила, отвечают за показ страниц. Фишка в том, что если ни одно из правил роутера не сработало выше данных правил, то затем срабатывают эти правила. Но тут только для страниц 2-х уровней вложенности.
Что насчёт ошибки 404, то её вы можете отдавать в методе `page` контроллера `Base`. Если не нашли ни одной страницы(в роутере это $dir1 либо $dir2), то выкидываем 404.