yii2 的 erroraction 配置只在应用组件的 errorhandler 中生效,必须设于 config/web.php 的 'components' => ['errorhandler' => ['erroraction' => 'site/error']],且视图路径为 @app/views/site/error.php,开发环境(yii_debug=true)会强制显示调试页而忽略该配置。

Yii2 中 errorAction 配置不生效?先确认它在哪设
Yii2 的错误页面路由由 errorAction 控制,但它**只在应用组件配置里生效**,不是在控制器或行为里随便设就能覆盖的。常见错误是把它写在 Controller::actions() 里,或者在 behaviors() 中试图拦截 —— 这些地方完全不参与错误分发流程。
正确位置是 config/web.php(或对应入口配置)的 'components' => ['errorHandler' => [...]] 下:
'errorHandler' => [
'errorAction' => 'site/error',
],
-
errorAction值必须是合法的路由格式:'controller/action',不能带模块前缀(除非你显式配置了route属性) - 该 action 对应的控制器方法必须存在,且返回视图(不能只是
throw new Exception) - 如果用了模块(如
admin),而错误页想放在模块内,得配'route' => 'admin/site/error',否则默认走应用级路由
自定义错误视图文件找不到?路径和命名有硬规则
Yii2 默认查找视图的路径是 @app/views/site/error.php(对应 site/error),但这个“site”不是随便写的 —— 它由 errorAction 的 controller 部分决定,且视图文件名必须叫 error.php,不能是 error-404.php 或其他名字(除非你手动改逻辑)。
- 视图路径固定为
@app/views/{controller}/error.php,其中{controller}是errorAction中斜杠前的部分 - 如果 controller 是
errors,那就要建@app/views/errors/error.php - 视图里能直接访问
$exception和$statusCode变量,别指望$model或其他控制器传参自动过来 - 调试时可临时在视图里加
<?php var_dump($exception->getMessage()); ?>确认是否真进来了
404 页面单独处理?别只靠 errorAction
errorAction 统一接管所有 HTTP 错误(包括 404),但它没法区分状态码。如果你要让 404 显示不同样式或逻辑,就得在 site/error 动作里手动判断:
public function actionError()
{
$exception = Yii::$app->errorHandler->exception;
if ($exception instanceof NotFoundHttpException) {
return $this->render('error-404');
}
return $this->render('error');
}
- 别依赖
$this->getView()->context或Yii::$app->getResponse()->getStatusCode()—— 在 error action 里它们可能还没被正确设置 - 真正可靠的是
Yii::$app->errorHandler->exception,它包含原始异常对象,instanceof判断最稳 - 注意:404 异常可能来自路由未匹配,也可能来自
throw new NotFoundHttpException(),两种情况都会走到这里
开发环境和生产环境显示不同?YII_DEBUG 会绕过你的视图
当 YII_DEBUG 为 true(即开发环境),Yii2 会强制显示自带的调试页面,完全忽略你配的 errorAction 和视图。这不是 bug,是设计如此 —— 调试信息优先级高于自定义错误页。
- 测试自定义错误页,必须把
YII_DEBUG设为false,并确保YII_ENV是'prod'或其他非'dev' - 本地调试时想看自定义页效果,可以临时在
web/index.php里加defined('YII_DEBUG') or define('YII_DEBUG', false); - 上线后如果还看到白屏或默认错误页,先检查
errorHandler是否被其他扩展(比如某些日志组件)覆盖了配置
最常漏掉的是:以为改了 errorAction 就万事大吉,结果忘了关 YII_DEBUG,或者视图路径拼错一个字母,然后花半小时查路由 —— 错误页本身不报错,它只会静默失败。











