YII2登录成功后如何返回用户之前访问的页面?
嘿,这两个需求在Yii2里都能通过框架自带的身份验证机制轻松实现,不用自己折腾复杂的跳转逻辑,我给你详细拆解一下:
需求一:登录成功后返回用户上次输入的URL
核心思路是在用户进入登录页时,把他的来源页面URL存起来,登录成功后再跳转回去。具体实现可以在登录动作里完成:
public function actionLogin() { // 如果已经登录,直接跳首页 if (!Yii::$app->user->isGuest) { return $this->goHome(); } $model = new LoginForm(); // 处理登录提交逻辑 if ($model->load(Yii::$app->request->post()) && $model->login()) { // 登录成功后跳转到之前存的returnUrl,没有的话默认跳首页 return $this->goBack(); } // GET请求进入登录页时,把来源URL设为returnUrl if (Yii::$app->request->isGet) { $referrer = Yii::$app->request->referrer; if ($referrer) { Yii::$app->user->setReturnUrl($referrer); } } $model->password = ''; return $this->render('login', [ 'model' => $model, ]); }
这里的关键是Yii::$app->user->setReturnUrl()把来源页存到session中,$this->goBack()会自动读取这个值完成跳转。如果用户是直接在地址栏输入登录页URL,referrer为空,goBack()就会默认跳首页,这是合理的场景处理。
需求二:访问需登录页面时,未登录跳转登录,登录后返回原页面
这个需求Yii2的AccessControl过滤器已经帮我们处理了核心逻辑,只需要正确配置访问规则,再配合登录动作的goBack()即可:
第一步:配置访问控制规则
在需要控制的控制器(比如SiteController)的behaviors()方法里,添加AccessControl规则,指定哪些动作需要登录权限:
public function behaviors() { return array_merge(parent::behaviors(), [ 'access' => [ 'class' => \yii\filters\AccessControl::class, 'rules' => [ // 允许未登录用户访问登录页和错误页 [ 'actions' => ['login', 'error'], 'allow' => true, ], // 仅允许已登录用户访问page2动作 [ 'actions' => ['page2'], 'allow' => true, 'roles' => ['@'], // @代表已登录用户 ], // 其他所有动作,未登录用户禁止访问 [ 'allow' => false, 'roles' => ['?'], // ?代表未登录用户 ], ], // 未登录用户访问受限页面时,自动跳转到登录页 'denyCallback' => function ($rule, $action) { return $this->redirect(['site/login']); }, ], ]); }
第二步:确保登录成功跳转用goBack()
直接复用需求一里的登录动作代码即可。因为当AccessControl拦截未登录用户访问page2时,会自动把page2的URL设置为returnUrl,所以登录成功后调用$this->goBack()就会自动跳回page2。
额外注意点
- 如果你用的是Yii2默认模板,
SiteController里已经有AccessControl的基础配置,只需要把page2加到需要登录的动作列表里就行。 - 可以给
goBack()传默认跳转地址,比如$this->goBack(['site/index']),避免没有returnUrl时的异常情况。
内容的提问来源于stack exchange,提问作者sibananda




