В SiteController, при условии указания error handler на site/error
public function actions()
{
return [
'error' => [
// изменяем класс обработчика ошибки
'class' => 'frontend\components\ErrorAction',
],
];
}
Далее создаем сам action:
<?php
namespace frontend\components ;
use Yii;
use yii\helpers\Url ;
class ErrorAction extends \yii\web\ErrorAction {
public function run()
{
if (($exception = Yii::$app->getErrorHandler()->exception) === null) {
$exception = new HttpException(404, Yii::t('yii', 'Page not found.'));
}
if ($exception instanceof HttpException) {
$code = $exception->statusCode;
} else {
$code = $exception->getCode();
}
if ($exception instanceof Exception) {
$name = $exception->getName();
} else {
$name = $this->defaultName ?: Yii::t('yii', 'Error');
}
if ($code) {
$name .= " (#$code)";
}
if ($exception instanceof UserException) {
$message = $exception->getMessage();
} else {
$message = $this->defaultMessage ?: Yii::t('yii', 'An internal server error occurred.');
}
if (Yii::$app->getRequest()->getIsAjax()) {
return "$name: $message";
} else {
// !!!!!!!!!!!!!!!!!!!!!!! в случае необходимости редиректить один из статусо ошибки - подойдет такой вариант. В случае редиректа ВСЕХ ошибок - нужно убрать все условия и оставить лишь реирект
if( $exception->statusCode == 404 ){
Yii::$app->getResponse()->redirect( Url::home(true), 301 )->send();
return;
}else{
return $this->controller->render($this->view ?: $this->id, [
'name' => $name,
'message' => $message,
'exception' => $exception,
]);
}
}
}}