Через yii средствами роута 
в config/yii
'components'=>array(
...
'urlManager'=>array(
  'urlFormat'=>'path',
  'showScriptName'=>false,
  'rules'=>array(
                '/'=>'',
                array('/aaa/default/index/id/58058', 'caseSensitive'=>false, 'pattern' => 'aaa', 'verb' => 'GET', 'parsingOnly' => true),
                array('/bbb/default/index', 'caseSensitive'=>false,  'pattern' => 'bbb.php', 'verb' => 'GET', 'parsingOnly' => true),
                array('/bbb/default/index', 'caseSensitive'=>false,  'pattern' => 'bbb', 'verb' => 'GET', 'parsingOnly' => true),
                array('/ccc/default/index', 'caseSensitive'=>false,  'pattern' => 'ccc', 'verb' => 'GET', 'parsingOnly' => true),
  ),
 ),
),
 
тогда по 
mysite.ru/aaa -> вызовет модуль aaa, котролер default, action index.
повесить на 404 обработчик 
 'components'=>array(
...
'errorHandler' => array(
   // use 'site/error' action to display errors
   'errorAction' => 'site/error',
  ),
),
вызовет контроле site, метод error
там уже проверяем что выводить зависмости от кода ошибки 
public function actionError()
 {
  $error=Yii::app()->errorHandler->error;
  if($error) {
   
  if(Yii::app()->request->isAjaxRequest){ 
   echo $error['message'];  
   Yii::app()->end(); 
  
  } else {
   if(!empty($error['code']) && $error['code'] == 404 && !empty($error['traces'][0]['args'][0]))
   {
    echo 'Query : '.$error['traces'][0]['args'][0];
    $this->redirect(array('bbb/index','str'=>$error['traces'][0]['args'][0]));
   }
  echo $error['message'];
 }
 }
в nginx:
location / {
        try_files $uri $uri/ /index.php?$args;
  root /var/www/site;
  index index.php index.html index.htm;
 }
 location ~ \.php$ {
   
  try_files $fastcgi_script_name =404;
  include /etc/nginx/fastcgi_params;
  fastcgi_pass   PollFPM;
  fastcgi_index index.php;
  fastcgi_param  SCRIPT_FILENAME  /var/www/site$fastcgi_script_name;
 }