Yii2伪静态404主因是Nginx未正确转发请求:需配置try_files $uri $uri/ /index.php?$args兜底,配合fastcgi_split_path_info与PATH_INFO传递,且frontend/backend须独立配置urlManager。

Yii2 在 Nginx 开启伪静态(enablePrettyUrl)后返回 404,90% 不是 Yii 写错了,而是请求压根没进框架——Nginx 拦在了外面,或者进了 PHP 却没把原始路径传给 Yii。
为什么 try_files $uri $uri/ /index.php?$args 必须写对
这是最常抄错却查不出问题的一行。它决定“谁来处理这个 URL”:
-
$uri:先查真实文件(比如/css/app.css),有就直接返回 -
$uri/:再查真实目录(比如/uploads/),有就尝试索引页 -
/index.php?$args:前面都失败,才交给 Yii 入口——缺这句,所有美化 URL 都 404
常见错误写法:try_files $uri $uri/ =404 或漏掉 ?$args。后者会导致 /user/login 被转成 /index.php(无查询参数),Yii 看不到原始路径,$_SERVER['REQUEST_URI'] 变成 /index.php,路由规则全失效。
fastcgi_split_path_info 和 PATH_INFO 缺一不可
即使 try_files 转过去了,如果 PHP-FPM 没收到正确的子路径,Yii 仍无法解析 /post/123 这类结构。关键两行必须同时存在:
-
fastcgi_split_path_info ^(.+\.php)(/.+)$;:告诉 Nginx 怎么从/index.php/post/123里拆出脚本名和路径部分 -
fastcgi_param PATH_INFO $fastcgi_path_info;:把拆出来的/post/123传给 PHP 的$_SERVER['PATH_INFO']
Windows 或用了符号链接的环境里,还必须用 $document_root 而非 $realpath_root 设置 SCRIPT_FILENAME,否则 Yii 加载配置阶段就中断,错误被吞成 500,Nginx error log 里只显示 Primary script unknown。
前后端共用 urlManager 是高级模板 404 的隐形推手
Yii2 高级模板中,frontend/web/index.php 和 backend/web/index.php 是两个独立入口,但很多人在 common/config/main.php 里统一配了一套 urlManager,结果前端能跑、后端 404,或反过来。
- 前端路由规则不能匹配后台控制器(比如
'admin/<controller:>/<action:>' => 'admin/<controller>/<action>'</action></controller></action:></controller:>) - 后端入口若误用了前端的
urlManager配置,enablePrettyUrl可能被关掉,或规则里写了不存在的模块名 - 检查点:确认
frontend/config/main.php和backend/config/main.php各自定义了完整的urlManager,且'enablePrettyUrl' => true显式开启
让真实错误浮出来:绕过 errorHandler 看原始报错
开发时看到白屏或跳到 site/error,不代表问题在控制器——很可能是路由根本没初始化成功,errorHandler 自己都还没加载。先强制暴露底层错误:
- 打开
web/index.php,确保开头三行是:defined('YII_DEBUG') or define('YII_DEBUG', true);defined('YII_ENV') or define('YII_ENV', 'dev');error_reporting(E_ALL); ini_set('display_errors', '1'); - 删掉缓存:
rm -rf runtime/cache/*,避免旧路由规则干扰 - 访问带
index.php的 URL 测试是否进框架,例如/index.php/site/index;能打开说明是伪静态配置问题,打不开则先查入口脚本权限、vendor/autoload.php路径、PHP 扩展是否齐全
最易忽略的是:Nginx 把请求转给了 index.php,但没传 REQUEST_URI —— 这时 Yii 看到的永远是 /index.php,urlManager 直接放弃解析,连 NotFoundHttpException 都不会抛,静默 fallback 到首页或空白页。



















