Yii页面跳转核心是正确使用redirect()(非不存在的_redirect()),传数组路由自动编码参数,配合return终止执行;辅以goHome()、goBack()等语义化方法,并通过Flash传递提示信息,规避headers已发送、referer伪造、开放重定向等风险。

在 Yii 中实现页面跳转,核心是用对方法、传对参数、避开常见陷阱。跳转不是简单写一行代码,而是要结合请求上下文、用户意图和安全要求来设计。
控制器内跳转:redirect() 是主力
最常用的是 $this->redirect(),它生成 HTTP 302 重定向响应,必须在响应发送前调用(即不能有 echo 或 header 已输出)。
- 跳转到本控制器的 action:
$this->redirect(['index']); - 跳转到其他控制器的 action:
$this->redirect(['post/view', 'id' => 123]); - 跳转到带锚点或查询参数的 URL:
$this->redirect(['user/profile', 'tab' => 'settings', '#' => 'permissions']); - 跳转后终止执行(推荐):
$this->redirect(['success'])->send(); Yii::$app->end();
快捷跳转方法:goHome 和 goBack
这两个是封装好的语义化方法,代码更清晰,也更安全。
-
$this->goHome():跳转到应用配置中定义的
homeUrl(默认为['site/index']) -
$this->goBack():跳转到上一页(读取
Yii::$app->request->referrer)。注意:如果 referrer 为空或等于当前页,会退回到首页,不会死循环 - 可指定 fallback:
$this->goBack(['site/index']);
跳转前的数据传递:Flash 机制很关键
跳转本身不带数据,但用户常需“操作成功”“保存失败”这类提示。Yii 的 Flash 恰好解决这个问题。
- 设置提示:
Yii::$app->session->setFlash('success', '文章已发布'); - 跳转后,在目标视图中读取:
if (Yii::$app->session->hasFlash('success')) { echo Yii::$app->session->getFlash('success'); } - Flash 数据只在下一次请求中有效,自动清除,无需手动管理生命周期
避免跳转陷阱:几个高频雷区
看似简单的跳转,实际容易踩坑。
- 不要在 render 后 redirect:视图已开始输出,header 无法发送,会报“headers already sent”错误
-
别依赖 $_SERVER['HTTP_REFERER']:它易被伪造且不可靠;用
Yii::$app->request->referrer更安全 -
外部 URL 要校验:若跳转地址来自用户输入(如 return_url 参数),务必白名单过滤或使用
Url::to()构建内部地址,防止开放重定向漏洞 - POST 提交后立即跳转:这是防止刷新重复提交的标准做法(Post-Redirect-Get 模式)



















