Можно ли все url перенаправлять на один контроллер как catchAll, кроме некоторых путей?

Да, в Yii вы можете настроить перенаправление всех URL на один контроллер, за исключением некоторых путей. В Yii это можно сделать с помощью правил маршрутизации и использования фильтров.

Маршрутизация в Yii осуществляется с помощью класса UrlManager, который управляет преобразованием URL-адресов на основе определенных правил. Чтобы настроить маршрутизацию, вам нужно изменить конфигурацию вашего приложения в файле config/main.php.

Сначала вам нужно настроить catchAll маршрут, который будет перенаправлять все URL на заданный контроллер и действие. Вы можете сделать это следующим образом:

'urlManager' => [
   'class' => 'yiiwebUrlManager',
   'rules' => [
      '' => 'site/index', // Контроллер "site" и действие "index"
      ...
   ],
   'enablePrettyUrl' => true,
   'showScriptName' => false,
],

После этого все URL будут перенаправляться на контроллер "site" и действие "index", если не будет совпадать с другими правилами.

Теперь, чтобы исключить некоторые пути из catchAll маршрута, вы можете использовать фильтры. Фильтры позволяют принимать решение о перенаправлении или обработке запроса до выполнения конкретного действия контроллера.

Для этого вам нужно создать фильтр, который будет проверять URL-адреса и решать, должен ли быть применен catchAll маршрут. Например, вы можете создать фильтр, который проверяет, находится ли URL-адрес в списке исключений:

class ExcludeFilter extends yiibaseActionFilter
{
    public $excludedPaths = [
        'admin' // исключение для пути "admin"
    ];

    public function beforeAction($action)
    {
        $pathInfo = Yii::$app->request->getPathInfo();
        if (in_array($pathInfo, $this->excludedPaths)) {
            return true; // продолжить выполнение маршрута по умолчанию
        }
        
        // выполняем catchAll маршрут
        Yii::$app->runAction('site/index');
        return false; // прекратить выполнение текущего маршрута
    }
}

Затем вам нужно применить этот фильтр к вашему контроллеру. Например, если ваш контроллер называется "SiteController", вы можете сделать это следующим образом:

class SiteController extends yiiwebController
{
    public function behaviors()
    {
        return [
            'excludeFilter' => [
                'class' => ExcludeFilter::className(),
                'excludedPaths' => ['admin'] // исключение для пути "admin"
            ],
        ];
    }

    // ...
}

Теперь URL-адреса, попадающие в исключенные пути, не будут перенаправляться на catchAll маршрут и будут обрабатываться согласно вашим правилам маршрутизации.