Неверный URL возврата в Yii Framework - PullRequest
3 голосов
/ 27 октября 2010

Я использовал Yii::app()->user->returnUrl, но он всегда перенаправляет меня на localhost/index.php.Есть ли какая-то конкретная конфигурация или какие-то части кода, которые другие программы, которые я должен написать?Если у вас есть другие решения, дайте мне знать.

Ответы [ 3 ]

3 голосов
/ 27 октября 2010

@ aslingga, не могли бы вы объяснить, что вы пытаетесь сделать с returnUrl?Вы просто пытаетесь вернуться туда, где вы были после входа в систему, или вы используете его где-то еще?

Это из документации Yii :

Перенаправляет пользовательский браузер на страницу входа.Перед перенаправлением текущий URL-адрес (если это не URL-адрес AJAX) будет сохранен в returnUrl, чтобы браузер пользователя мог быть перенаправлен обратно на текущую страницу после успешного входа в систему.Убедитесь, что вы установили loginUrl, чтобы браузер пользователя мог быть перенаправлен на указанный URL-адрес входа после вызова этого метода.После вызова этого метода текущая обработка запроса будет прервана.

Другими словами, если страница, которую вы пытаетесь запросить, требует аутентификации, URI страницы, на которой вы находитесь, сохраняется впеременная сеанса.Затем, как только вы вошли в систему, вы вернетесь на эту страницу.

Один из способов, по которому я бы порекомендовал устранить неполадки, - это сделать print_r($_SESSION); просто для того, чтобы убедиться, что returnUrl действительно сохраняется.Затем вы сможете проверить, хранится ли index.php как returnUrl или просто по какой-то причине вас там перенаправляют.

Просмотр методов CWebUser getState и setState также может быть полезен.

3 голосов
/ 21 февраля 2013

Я знаю, что этот вопрос старый, но, возможно, это поможет кому-то, так как я нигде не смог найти достойного ответа.

Как работает getReturnUrl

Установка возвращаемого URL по умолчаниюдля вашего приложения Yii требуется немного настроек.Как это работает «из коробки», вы задаете URL-адрес возврата по умолчанию при каждом его вызове:

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

Идея заключается в том, что если пользователь посетит страницу, требующую аутентификации, он получитперенаправлены на страницу входа, но не раньше, чем сайт работает

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

Теперь, когда пользователь входит в систему, он будет возвращен на страницу, на которую он намеревался перейти.

Хотя мне нравятся эти функции, необходимость каждый раз задавать URL-адрес возврата по умолчанию - глупость.Если вы хотите изменить возвращаемый URL по умолчанию, вы должны найти его по всему коду.Я полагаю, вы могли бы установить значение в параметре сайта и вызвать

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

Не думаю, что мне нужно объяснять, почему это решение тоже раздражает.

Мое решение

Поэтому, когда getReturnUrl вызывается без каких-либо параметров, он возвращает либо «/index.php», либо просто «/».Это хорошо в некоторых случаях, но не всегда.Это лучше IMO.

Сначала расширьте класс CWebUser и добавьте следующие дополнения

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);
    }
}

Теперь давайте добавим пару элементов пользователю массив компонентов.

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

Это не только позволяет вам установить URL-адрес возврата по умолчанию в конфигурации, но также поддерживает возможность установки другого URL-адреса возврата по умолчанию и использовать функциональность setReturnUrl.

0 голосов
/ 27 октября 2010

Я думаю, вы должны установить его:

Yii::app()->user->setReturnUrl('controller/action');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...