You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Yii2实现登录后跳转至初始请求页面的方法问询

Yii2 实现登录后跳转至初始请求URL

获取初始请求URL的两种实用方式

方式一:利用Yii2用户组件自动处理

Yii2的User组件会自动在未登录用户访问受限页面时,记录下当前请求的URL到returnUrl属性中。登录验证成功后直接调用goBack()方法即可完成跳转:

public function actionLogin()
{
    if (!Yii::$app->user->isGuest) {
        return $this->goHome();
    }

    $model = new LoginForm();
    if ($model->load(Yii::$app->request->post()) && $model->login()) {
        // 自动跳转到被拦截的初始URL,无记录则跳转首页
        return $this->goBack();
    }

    $model->password = '';
    return $this->render('login', compact('model'));
}

对应的访问控制配置无需额外修改,默认规则即可:

public function behaviors()
{
    return [
        'access' => [
            'class' => \yii\filters\AccessControl::class,
            'rules' => [
                [
                    'allow' => true,
                    'roles' => ['@'], // 已登录用户允许访问
                ],
                [
                    'allow' => true,
                    'actions' => ['login'], // 登录页面允许未登录访问
                    'roles' => ['?'],
                ],
            ],
        ],
    ];
}

方式二:手动存储初始URL到Session

如果需要自定义拦截逻辑,可在denyCallback中手动把初始请求URL存入Session,登录成功后读取跳转:

public function behaviors()
{
    return [
        'access' => [
            'class' => \yii\filters\AccessControl::class,
            'rules' => [
                // 同上访问规则
            ],
            'denyCallback' => function ($rule, $action) {
                // 存储当前请求的完整URL到Session
                Yii::$app->session->set('returnUrl', Yii::$app->request->absoluteUrl);
                return Yii::$app->response->redirect(['site/login']);
            },
        ],
    ];
}

登录动作中读取并完成跳转:

public function actionLogin()
{
    if (!Yii::$app->user->isGuest) {
        return $this->goHome();
    }

    $model = new LoginForm();
    if ($model->load(Yii::$app->request->post()) && $model->login()) {
        // 读取Session中的初始URL,无记录则跳转首页
        $returnUrl = Yii::$app->session->get('returnUrl', Yii::$app->homeUrl);
        // 安全校验:确保跳转URL属于当前站点,防止恶意跳转
        if (!Yii::$app->request->getIsLocal($returnUrl)) {
            $returnUrl = Yii::$app->homeUrl;
        }
        return $this->redirect($returnUrl);
    }

    $model->password = '';
    return $this->render('login', compact('model'));
}

关键注意事项

  • Yii::$app->request->url获取相对路径,absoluteUrl获取完整URL,可根据需求选择。
  • 必须添加本地URL校验,避免被利用跳转至恶意外部网站。

内容的提问来源于stack exchange,提问作者Juan Alonso

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 03:22:47