windows下yii 404需分层排查:先确认请求是否进入php(访问/index.php/product/index),再检查web服务器配置(nginx需$uri/ /index.php?$args及path_info,iis需开放.php扩展和http谓词),最后验证yii内部控制器名、视图路径、urlmanager与errorhandler配置。

Windows环境下Yii跳转总出404,不是框架“抽风”,而是请求在进PHP前就断了,或进PHP后没被正确路由。关键要分清:是Web服务器(IIS/Nginx/Apache)拦下的404,还是Yii自己抛的NotFoundHttpException。下面按真实排查顺序列重点。
先确认请求到底有没有进Yii
直接访问 /index.php/product/index(带index.php),能打开说明Yii运行正常,问题出在URL美化环节;打不开则说明入口脚本没执行成功——这时候别调代码,先查环境。
- 检查
index.php文件权限:Windows下IIS或Apache若以IUSR或www-data身份运行,需确保该用户对index.php有读取+执行权限 - 查看PHP错误日志(
php_error.log):常见如require(): Failed opening required 'vendor/autoload.php',说明Composer未安装或路径错 - 在
index.php最开头加一行:file_put_contents('C:/temp/yii-start.log', date('Y-m-d H:i:s') . " —— entered\n", FILE_APPEND);,看日志是否写入,确认脚本是否真被执行
Nginx配置必须带$args和PATH_INFO
Windows上Nginx常因配置精简而漏关键项,导致/product/123被传成/index.php,Yii收不到原始路径。
在 Windows 11 上"直接发声"的 TTS(从 WSL2/TUI 调用 powershell.exe + System.Speech)。适用于用户说"说出来/读出来/语音播报/用TTS",或反馈"没声音/tts 生成的 mp3 是空的/播不出来",以及需要中文语音但 OpenClaw 内置 tts 不可用时。
-
try_files $uri $uri/ /index.php?$args;——$args不能省,否则GET参数和path info全丢 - 在
location ~ \.php$块中必须包含:fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;<br>fastcgi_split_path_info ^(.+\.php)(/.+)$;<br>fastcgi_param PATH_INFO $fastcgi_path_info;<br>fastcgi_param REQUEST_URI $request_uri;
- 不用
$document_root而用$realpath_root:Windows符号链接多,$document_root可能指向快捷方式而非真实路径
IIS用户请关掉“请求筛选”和检查扩展
IIS默认比Nginx/Apache更保守,很多404其实是它自己拦截的,Yii根本没机会响应。
- 打开IIS管理器 → 选择站点 → “请求筛选” → “HTTP谓词”标签页 → 确保
GET、HEAD、POST已启用 - 同页面 → “文件扩展名”标签页 → 检查
.php是否被拒绝(状态码404.7),右键“允许”即可 - “处理程序映射”里确认
PHP_via_FastCGI存在且启用;若用ISAPI,需额外注册PHP扩展 - 禁用“静态内容”以外的模块(如WebDAV)可快速排除干扰
Yii内部:控制器、视图、路由三处最容易手滑
只要请求进了index.php,404基本锁定在这三个位置。
-
控制器名大小写敏感:Windows文件系统不区分大小写,但Yii路由匹配严格按类名来。比如控制器类是
ProductController,但URL写了/product/index(小写)没问题,而/Product/index(大写P)在Linux会404,在Windows也可能因缓存或Gii生成路径不一致导致失败 -
视图路径必须精准:Gii生成
ProductController,默认找@app/views/product/index.php。放错到views/site/product/或views/layouts/下,Yii连渲染都不触发,直接抛404异常 -
urlManager规则没生效:确认
config/web.php中'enablePrettyUrl' => true且'showScriptName' => false;再检查'rules'数组是否含类似'product/<id:>' => 'product/view'</id:>的条目,正则中的\d+不匹配字母,别用\w+代替除非你真需要支持中文或中划线
最后验证errorHandler是否真正接管
即使其他都对,没配好errorHandler,404也会退回到空白页或IIS默认页。
- 在
config/web.php的components里明确写:'errorHandler' => [<br> 'errorAction' => 'site/error',<br>],
-
SiteController::actionError()里加判断:if ($exception instanceof \yii\web\NotFoundHttpException) {<br> return $this->render('error-404');<br>} - 对应视图必须放在
@app/views/site/error-404.php,不能叫404.php或放在views/errors/下——Yii只认errorAction指定的controller+固定error.php名,改名就得同步改配置










