yii2.0 报错需先区分500(php崩溃,如cookievalidationkey未配置)和404(路由或web服务器问题),再检查调试模式、cookievalidationkey、数据库host、open_basedir及nginx/apache配置差异,最后注意控制器继承、布局逻辑和表单用法重构。

Yii2.0 报错无法访问,不能直接套用 Yii1.1 的排查思路——两者底层机制差异大,很多常见问题在 Yii1.1 里压根不存在,硬搬会走偏。
先分清是 500 还是 404
这是最紧要的第一步,两类错误根源完全不同:
-
500 错误:PHP 层面崩溃,比如配置缺失、权限不足、扩展没加载。Yii2 启动阶段就失败,连框架都没跑起来。典型如
cookieValidationKey must be configured、Class 'CController' not found、Failed opening required 'vendor/autoload.php'。 -
404 错误:请求进了框架但路由找不到,或是 Web 服务器根本没把请求交给 Yii。比如美化 URL 没配好、Nginx location 写错、视图文件放错目录(如 CRUD 的
views/product/被误放到views/layouts/)。
Yii2 必查的几处关键配置
这些在 Yii1.1 里要么没有,要么写法不同,必须单独核对:
-
入口脚本是否启用调试:打开
web/index.php,确认有defined('YII_DEBUG') or define('YII_DEBUG', true);,并设YII_ENV = 'dev';再加两行强制报错:error_reporting(E_ALL); ini_set('display_errors', '1');。 -
cookieValidationKey 是否配置:在
config/web.php的'request'组件里必须设置,例如'cookieValidationKey' => 'a-random-32-char-string-here',缺了直接 Fatal Error。 -
数据库 host 别写 localhost:尤其 macOS/Linux 本地开发时,改用
127.0.0.1可绕过 Unix socket 路径不匹配问题;Docker 或远程环境也建议明确 IP。 -
open_basedir 限制:LNMP 环境下常因 PHP 安全限制导致自动加载失败,需检查
fastcgi.conf中open_basedir是否包含项目根目录(如/home/wwwroot/your-app/)。
Web 服务器配置差异大
Yii1.1 对 Apache .htaccess 兼容性好,Yii2 尤其高级版对 Nginx 要求更细:
- Apache 需确保
.htaccess文件存在且内容正确,含RewriteCond %{REQUEST_FILENAME} !-f和!-d规则。 - Nginx 必须启用
fastcgi_split_path_info,否则 PATH_INFO 解析失败,Yii 收不到真实路由;还要用$realpath_root而非$document_root,避免符号链接或 Windows 路径解析出错。 - 前后端分离部署(如 advanced 版)时,
/frontend/web和/backend/web必须各自作为独立 root,不能共用一个 location。
控制器与布局逻辑已重构
这部分 Yii1.1 开发者最容易踩坑:
- 控制器必须继承
yii\base\Controller,类名去掉C前缀;Yii::app()全部换成Yii::$app。 - 布局不再靠
$this->layout = 'main'直接赋值,而是通过findLayoutFile()动态查找,优先级为:控制器级$this->layout> 应用配置'layout' => 'xxx'> 默认路径。写在类体里(非方法中)会被静默忽略。 - 表单必须
use yii\widgets\ActiveForm,调用$form->field();对象创建统一用Yii::createObject(),构造参数最后是配置数组。











