yii控制器跳转应使用redirect()而非不存在的\_redirect(),否则报call to undefined method错误;正确用法为yii 2.x中return $this->redirect(['route', 'param' => $val]),yii 1.x中$this->redirect($url)自动exit。

Yii控制器跳转用 redirect(),不是 _redirect() —— 这个方法根本不存在,写错会直接报 Call to undefined method 错误。
为什么调用 _redirect() 会报错
Yii 1.x 和 Yii 2.x 都没有叫 _redirect() 的方法。常见错误是把旧框架(如 CodeIgniter)习惯带进来,或误看网上过时文档。实际跳转入口是控制器基类提供的 redirect()(Yii 2.x)或 $this->redirect()(Yii 1.x),它本质是调用 Response::redirect() 并终止当前请求。
- Yii 2.x 中:必须用
$this->redirect($url)->send()或配合return(推荐) - Yii 1.x 中:用
$this->redirect($url),内部自动 exit - 手写
_redirect()会导致Fatal error: Call to undefined method
redirect() 的 URL 参数怎么写才不丢参
参数传递不是靠“拼字符串”,而是靠框架自动编码。硬拼 ?id=123&name=test 容易出编码问题或 XSS 风险,也难维护。
- 跳转到本应用内路由:传数组,如
['post/view', 'id' => 123, 'slug' => 'hello-world'],框架自动生成合法 URL - 跳转到站外地址:直接传字符串,如
'https://example.com',但需确保协议完整 - 带锚点或查询参数的外部链接:仍用字符串,
'/login?ref=dashboard#top'可以,但中文等特殊字符要提前urlencode() - 别在数组里传原始 URL 字符串——
['/admin/user?id=123']会被二次编码,变成/admin/user%3Fid%3D123
跳转后参数收不到?检查这三处
常见现象是跳过去发现 $_GET 为空、Yii::$app->request->get('id') 返回 null,其实问题往往不在跳转本身。
- 没加
return(Yii 2.x):写了$this->redirect(...)但没return,后续代码继续执行,可能覆盖响应或触发 headers already sent - 跳转目标是 POST 接口:浏览器重定向只发 GET 请求,原 POST 数据不会携带过去;需要改用
refresh()或 session 临时存值 - URL 中用了相对路径且上下文错乱:比如在 console 控制器里调用
redirect('/web/index.php/site'),但当前无 Web 环境,会跳到错误位置
Yii 2.x 中最稳妥的跳转写法
一句话:用数组定义路由 + return + 显式状态码(可选)。不依赖全局函数,不手动 send,不拼接 URL。
return $this->redirect(['user/profile', 'id' => $userId, 'tab' => 'settings'], 302);
注意:302 是默认值,不用写也行;如果想强制客户端缓存跳转(极少用),才显式传 301。别传 307 或 308——Yii 2.0.39 之前不支持,升级后也要确认服务器配置是否透传。
真正容易被忽略的是:跳转前如果有未提交的事务、未关闭的日志句柄、或正在写入 session,redirect() 后这些操作可能被截断。别假设“跳转很快,不影响”。











