【问题标题】:Yii returnUrl functionYii returnUrl 函数
【发布时间】:2012-03-27 16:20:40
【问题描述】:

大家好,我在 main.php 配置文件中有这段代码:

'components' => array(
    '[.........]',
    'user'=>array(
        // enable cookie-based authentication
        'allowAutoLogin'=>true,
        'autoRenewCookie' => true,
        'returnUrl' => 'http://stackoverflow.com',
    )
);

我的问题是 id 在登录后没有将用户重定向到http://stackoverflow.com,你能帮帮我吗?

用户控制器.php:

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

    $model=new LoginForm;

    // if it is ajax validation request
    if(isset($_POST['ajax']) && $_POST['ajax']==='login-form')
    {
        echo CActiveForm::validate($model);
        Yii::app()->end();
    }

    // collect user input data
    if(isset($_POST['LoginForm']))
    {
        $model->attributes=$_POST['LoginForm'];
        // validate user input and redirect to the previous page if valid
        if($model->validate() && $model->login())
            $this->redirect(Yii::app()->user->returnUrl);
    }
    // display the login form
    $this->render('login',array('model'=>$model));
}

【问题讨论】:

  • 你的登录功能怎么样?
  • 您是否在重定向后使用登录页面? (例如,如果您无法访问页面并且它会重定向到登录屏幕)如果是,则重定向会将 returnUrl 设置为覆盖 config/main 设置的原始页面的值。
  • 作为解决方案,我建议阅读我对这个 [问题][1] 的回答。 [1]:stackoverflow.com/questions/13270875/…

标签: php redirect frameworks login yii


【解决方案1】:

我找到了解决问题的方法。我在 login.php 中添加了这行代码,因此用户登录后它将重定向到上一页:

if (Yii::app()->request->urlReferrer != 'http://www.example.com/user/login' && 
    Yii::app()->request->urlReferrer != 'http://www.example.com/user/register')
{
    Yii::app()->user->setReturnUrl(Yii::app()->request->urlReferrer);
}

【讨论】:

  • 如果我想添加动态登录url而不是硬编码url,那么如何动态获取这个登录url?
  • 您应该使用!== 而不是!=
  • 很好,但是有没有办法让它不依赖于站点?能够处理 stage.example.com... 和 example.com 会很棒。似乎 setReturnUrl 应该足够智能,可以返回 Yii 表单,而不仅仅是 urlReferrer。
【解决方案2】:

试试这个以跟踪上次访问的有效 url:

添加到您的配置:

'preload' => array(
    // preloading 'loginReturnUrlTracker' component to track the current return url that users should be redirected to after login
    'loginReturnUrlTracker'
),
'components' => array(
    'loginReturnUrlTracker' => array(
        'class' => 'application.components.LoginReturnUrlTracker',
    ),
    ...
),

将此文件放在 components/LoginReturnUrlTracker.php 中:

<?php

class LoginReturnUrlTracker extends CApplicationComponent
{

    public function init()
    {
        parent::init();

        $action = Yii::app()->getUrlManager()->parseUrl(Yii::app()->getRequest());

        // Certain actions should not be returned to after login
        if ($action == "site/error") {
            return true;
        }
        if ($action == "site/logout") {
            return true;
        }
        if ($action == "site/login") {
            return true;
        }

        // Keep track of the most recently visited valid url
        Yii::app()->user->returnUrl = Yii::app()->request->url;

    }

}

【讨论】:

    【解决方案3】:

    Yii 会覆盖这个在配置文件中设置的返回 url。

    您可以在 params 中定义此返回 url,也可以通过 createUrl 函数生成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-18
      相关资源
      最近更新 更多