核心问题是请求未进入yii或路由失败,需先区分是web服务器拦截的404还是yii抛出的notfoundhttpexception;再依次排查入口脚本执行、nginx配置(含$args、$realpath_root、fastcgi_split_path_info)、前后端urlmanager配置一致性及视图目录位置是否正确。

Yii2高级版前后端访问404,核心问题不是“页面找不到”,而是请求没进框架,或进了框架却路由失败。得先分清是Web服务器拦下的404,还是Yii自己抛的NotFoundHttpException——这两类原因完全不同,排查路径也完全相反。
先确认请求是否真正进入Yii
直接访问带index.php的URL,比如:http://your-site.com/frontend/web/index.php/site/indexhttp://your-site.com/backend/web/index.php/site/login
如果能打开,说明PHP环境、入口脚本、控制器都正常,问题只出在URL美化(pretty URL)环节;
如果打不开,说明连入口都没过——这时候别调代码,重点查:
- Web服务器是否把
/frontend/web或/backend/web设为根目录(不是项目根目录) -
index.php文件权限是否允许Web用户读取(Windows下尤其注意IUSR或IIS_IUSRS权限) - PHP错误日志里有没有
Failed opening required 'vendor/autoload.php'——这代表Composer没装或路径错 - 在
frontend/web/index.php最开头加一行:file_put_contents('/tmp/yii-entry.log', date('c') . " —— frontend entered\n", FILE_APPEND);
看日志有没有写入,确认脚本是否真被执行
Nginx配置漏关键项,美化URL必挂
高级版前后端分离部署,/frontend/web和/backend/web各自是独立入口,Nginx必须为每个location单独配规则。常见错误是复制粘贴时漏掉$args或PATH_INFO支持。
正确写法(以frontend为例):
location / {
try_files $uri $uri/ /index.php?$args;
}
<p>location ~ .php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_split_path_info ^(.+.php)(/.+)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_pass 127.0.0.1:9000;
}</p>
- 缺
$args→/product/123变成/index.php,Yii收不到原始路径 - 用
$document_root不用$realpath_root→ Windows或符号链接环境下路径解析失败 - 没开
fastcgi_split_path_info→ Yii无法拆出PATH_INFO,直接返回404
前后端urlManager配置不匹配
高级版中,frontend/config/main.php和backend/config/main.php要各自配置urlManager,不能只改一个。
必须同时满足:
'enablePrettyUrl' => true'showScriptName' => false-
'rules' => []或含合理自定义规则(注意正则边界,如<controller:>/<action:></action:></controller:>不匹配中划线,需写<controller:></controller:>)
另外检查:
- 前端访问/product/index,对应控制器是frontend\controllers\ProductController,不是common\controllers;
- 后端访问/admin/user,控制器应在backend\controllers\Admin\UserController,命名空间和目录结构必须严格对应。
视图文件放错位置,最隐蔽的404来源
Gii生成CRUD后,视图默认建在views/product/,但高级版前后端分离,这个路径是相对各自web入口的。
正确结构应为:
frontend/
├── controllers/
│ └── ProductController.php
├── views/
│ └── product/ ← 这里放 index.php、view.php 等
└── web/
└── index.php
常见错误:
- 把
views/product/建在项目根目录或common/views/下 → Yii找不到 - 误放在
views/layouts/product/→ layouts只存布局文件,不存业务视图 - 后台模块用了
backend/modules/admin,但视图却建在views/admin/而不是backend/modules/admin/views/
验证方法:在控制器actionIndex()里临时加return 'OK';,如果能输出,说明路由通了,问题一定出在视图路径或渲染逻辑上。











