开发者

Wrong return url in Yii framework

开发者 https://www.devze.com 2023-01-21 08:41 出处:网络
I have used Yii::app()->user->returnUrl bu开发者_JS百科t it always redirect me to localhost/index.php. Is there any particular configuration or some pieces of code that other programs that I mus

I have used Yii::app()->user->returnUrl bu开发者_JS百科t it always redirect me to localhost/index.php. Is there any particular configuration or some pieces of code that other programs that I must write? If you have another solutions let me know it.


@aslingga, can you please explain what you're trying to do with returnUrl? Are you just trying to get back to where you were after logging in, or are you using it somewhere else?

This is from the Yii documentation:

Redirects the user browser to the login page. Before the redirection, the current URL (if it's not an AJAX url) will be kept in returnUrl so that the user browser may be redirected back to the current page after successful login. Make sure you set loginUrl so that the user browser can be redirected to the specified login URL after calling this method. After calling this method, the current request processing will be terminated.

In other words, if the page you're trying to request requires authentication, the URI of the page you're on gets stored in a session variable. Then, once you've logged in, it takes you back to that page.

One way I'd recommend troubleshooting is to do a print_r($_SESSION); just to make sure the returnUrl is actually being stored. Then you'll be able to check if index.php is being stored as returnUrl or if you're just being redirected there for some reason.

Looking at the CWebUser methods getState and setState might also be helpful.


I know this question is old but maybe this will help someone out since I didn't couldn't find a decent answer anywhere.

How getReturnUrl works

Setting a default return URL for your Yii app requires a bit of customization. The way it works out of the box is that you specify the default return URL each time you call it:

Yii::app()->user->getReturnUrl('site/internal');

The idea being that if a user were to visit a page that requires authentication, they will get redirected to the login page, but not before the site running

Yii::app()->user->setReturnUrl('site/visitedpage');

Now when the user logs in, they will be returned to the page they intended to go to.

While I like that functionality, having to set the default return URL each time is dumb. If you want to change the default return URL, you have to go find it throughout your code. I suppose you could set the value in a site parameter and call

Yii::app()->user->getReturnUrl(Yii::app()->params['defaultReturnUrl']);

I don't think I have to explain why that solution is annoying too.

My Solution

So when getReturnUrl is called without any parameters, it returns either '/index.php' or just '/'. This is fine in some cases, but not always. This is better IMO.

First, extend the CWebUser class and add the following extras

class WebUser extends CWebUser {
    // default return URL property
    public defaultReturnUrl;

    // override the getReturnUrl method
    public function getReturnUrl($defaultUrl=NULL) {
        if ($defaultUrl === NULL) {
            $defaultReturnUrl = $this->defaultReturnUrl;
        }
        else {
            $defaultReturnUrl = CHtml::normalizeUrl($defaultUrl);
        }
        return $this->getState('__returnUrl',$defaultReturnUrl);
    }
}

Now, let's add a couple items to the user component array.

'user' => array(
    'class' => 'WebUser',
    'defaultReturnUrl' => 'site/internal'
)

Not only does this allow you to set a default return URL in the config, but also maintains the ability to set a different default return URL and use the setReturnUrl functionality.


I think, you must set it:

Yii::app()->user->setReturnUrl('controller/action');
0

精彩评论

暂无评论...
验证码 换一张
取 消