先确认请求是否进入yii:访问/index.php/product/index,能打开说明问题在url美化,打不开则请求未进php;需检查index.php权限、php错误日志、fastcgi_split_path_info配置及views目录结构。

先确认请求到底进没进Yii
打不开 /product/index 不代表代码错了,可能连 index.php 都没执行。直接访问带入口脚本的地址:/index.php/product/index。
能打开 → 问题在URL美化(urlManager 或 Web服务器重写);打不开 → 请求根本没进PHP,别调控制器,去查环境。
- 在
frontend/web/index.php开头加file_put_contents('/tmp/yii-hit.log', 'hit', FILE_APPEND),看日志有没有生成 - 检查 PHP 错误日志里有没有
Failed opening required 'vendor/autoload.php'—— 这说明 Composer 没装或路径错 - Windows 下特别注意
index.php权限:IIS_IUSRS 或 IUSR 必须有读取权限
Nginx配置漏了fastcgi_split_path_info就必然404
这是 Linux 和 Windows 上最常被忽略的一环。没有它,$_SERVER['PATH_INFO'] 就是空的,Yii 收不到 /product/123 里的路径段,所有路由规则全失效。
必须在 location ~ \.php$ 块里配齐这三行:
fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
注意:SCRIPT_FILENAME 一定要用 $document_root,不是 $realpath_root —— 后者在符号链接或 Windows 环境下容易触发 open_basedir 限制或“Primary script unknown”错误。
urlManager 配置对但视图目录放错位置也会404
Gii 生成的 ProductController 默认找 views/product/ 下的 index.php。如果文件被扔进了 views/layouts/product/ 或 views/site/,Yii 找不到视图,就抛 NotFoundHttpException,表现就是 404。
- 正确结构:
views/product/index.php、views/product/_form.php等 - 错误结构:
views/layouts/product/(这是放布局模板的)、views/default/(旧版习惯,Yii2 不认) - 前后端分离项目要分别检查:
frontend/views/product/和backend/views/product/,别混用
大小写和连字符不匹配是隐形坑
Yii2 路由默认只认小写字母 + 数字 + 连字符,getServerAddr 控制器名会被转成 getserveraddr,导致 /getServerAddr 匹配失败。
不要改框架源码去放宽正则,用 urlManager 规则硬映射:
'rules' => [
'get-server-addr' => 'get-server-addr/index',
'api/<controller:>' => 'api/<controller>',
],</controller></controller:>
注意规则顺序:越具体的放越前;正则里想匹配中划线得用 [\w\-]+,不能只写 \w+。
复杂点在于,这个错不会报任何明显提示——请求静默 fallback 到首页或返回空白,你得靠 file_put_contents 打印 $_SERVER['REQUEST_URI'] 和 $_SERVER['PATH_INFO'] 才能看出路径根本没传进来。











