Yii2生产环境空白500页面主因是YII_DEBUG和YII_ENV配置错误:需在web/index.php顶部显式定义YII_DEBUG=true、YII_ENV='dev',并手动启用error_reporting(E_ALL)和ini_set('display_errors','1')。

Yii2 默认在生产环境会隐藏真实错误,只返回空白 500 页面——这不是代码写错了,而是 YII_DEBUG 和 errorHandler 配置没调对。
web/index.php 里 YII_DEBUG 和 YII_ENV 必须显式设对
很多人的 500 错误根本不是 PHP 报错,而是框架连错误都没机会抛出来。关键看入口文件第一段:
-
defined('YII_DEBUG') or define('YII_DEBUG', true);—— 开发时必须为true,否则所有异常被静默吞掉 -
defined('YII_ENV') or define('YII_ENV', 'dev');—— 必须是'dev','prod'下即使YII_DEBUG=true也会绕过调试页 - 这两行不能被注释、不能拼错、不能放在
require __DIR__ . '/../vendor/autoload.php';后面
PHP 层错误显示要手动打开,别信 php.ini
Yii2 不会自动继承 php.ini 的 display_errors 设置,尤其 Windows 下 IIS 或 Apache 常有覆盖。直接在 web/index.php 顶部加两行:
error_reporting(E_ALL);
ini_set('display_errors', '1');
注意:ini_set('display_errors', '1') 必须是字符串 '1',写成 1 在某些 SAPI(如 CGI)下无效;error_reporting(E_ALL) 要放在 define('YII_DEBUG', ...) 之后,否则部分警告可能被跳过。
errorAction 配置位置和命名规则很严格
想让 site/error 生效,三个条件缺一不可:
- 配置必须写在
config/web.php的'components' => ['errorHandler' => [...]]里,不能塞进behaviors()或控制器actions()中 -
'errorAction' => 'site/error'中的site是控制器 ID,对应controllers/SiteController.php;若控制器在模块里(如admin),得配'route' => 'admin/site/error' - 视图路径固定为
@app/views/site/error.php,文件名必须是error.php,不是error.html或error-page.php;大小写敏感,Windows 下容易忽略这点
调试时别依赖 $exception->getTraceAsString()
在 error.php 视图里用 $exception->getMessage() 没问题,但千万别直接输出 $exception->getTraceAsString() —— 它会暴露 runtime/ 绝对路径、数据库密码占位符甚至 $_SERVER 全量内容。开发阶段可临时加:
<?php if (YII_DEBUG): ?>
<pre class="brush:php;toolbar:false;"><?= $exception->getTraceAsString() ?>
上线前必须删掉或改成日志记录。真正该检查的是 runtime/logs/app.log 和 Web 服务器原生日志(IIS 的 Failed Request Tracing 或 Apache 的 error_log),它们才包含 PHP 致命错误的真实上下文。


















