Что вызывает петлю перенаправления?

Вот мои страницы:

Страница перенаправления: если у пользователя есть открытый сеанс, перенаправить на соответствующий ресурс, иначе перенаправить на страницу входа.

Страница входа: если информация для входа пользователя действительна, перенаправить на $_SERVER['HTTP_REFERER'], иначе отобразить страницу входа.

Когда вы посещаете страницу перенаправления, она видит, что у вас нет действительного сеанса, и перенаправляет на страницу входа. Затем вы можете без проблем войти в систему, но после аутентификации я получаю сообщение «Эта веб-страница имеет петлю перенаправления». страницу в Хроме.

Это не настоящий цикл, поскольку есть несколько выходов (IE предоставляет действительные данные для входа и переходит к целевому ресурсу, предоставляет неверный вход и получает сообщение об ошибке и т. д.). Но я вижу замешательство браузера (переход от a к b и снова к a).

Любые идеи, как я могу решить эту проблему?

Ваше здоровье


person Cory Dee    schedule 23.11.2010    source источник
comment
Проблема, вероятно, связана с $_SERVER['HTTP_REFERER'], вы можете использовать здесь фактические пути.. ?? Что, если мой Referrer является вашим сценарием перенаправления, и у меня есть действительный сеанс, он увидит, что сеанс действителен, и перенаправит меня на предыдущий сценарий перенаправления. Надеюсь, я правильно понял архитектуру вашего приложения.   -  person Jasdeep Singh    schedule 23.11.2010


Ответы (5)


$_SERVER['HTTP_REFERER'] всегда будет страницей входа, так как вам нужно загрузить страницу входа прямо перед тем, как вы успешно войдете в систему. Таким образом, как только вы успешно вошли в систему, реферером является страница входа, поэтому страница входа перенаправляет вас на страницу входа, на которой вы все еще успешно вошли, поэтому она регистрирует вас снова и снова.

Вместо того, чтобы полагаться на $_SERVER['HTTP_REFERER'], вам, вероятно, следует сохранить страницу, на которую они пытаются попасть, либо в переменной $_SESSION, либо в переменной $_COOKIE. Скорее всего, сеанс будет лучше, в зависимости от ваших настроек.

person Jeff Davis    schedule 23.11.2010

После отправки ваших данных для входа $_SERVER['HTTP_REFERER'] будет URL-адресом вашей страницы входа, поскольку последняя страница, которую видел пользователь, была формой для входа.

Рассмотрите возможность сохранения URL-адреса «перенаправления на» в сеансе PHP перед перенаправлением на страницу входа. Вы также можете передать его в качестве параметра при перенаправлении на страницу входа, но я вижу, что этот подход имеет потенциальные недостатки безопасности (например, перенаправление пользователей на другой сайт, добавление поддельных заголовков HTTP и т. д.).

person thelem    schedule 23.11.2010

Я предполагаю:

Если у пользователя есть сеанс, но он недействителен (например, хэш сеанса не совпадает), он перенаправляется на страницу входа (поскольку у него есть сеанс). Но когда он туда попадает, вы проверяете, есть ли у него сессия, и она есть (но это недействительно), поэтому вы перенаправляете его на индексный ресурс. Там вы проверяете, действителен ли сеанс, но это не так. Таким образом, вы перенаправляете его на страницу входа. И так далее...

Как это исправить? Проверьте действительность сеанса (а не только его существование) как на странице входа, так и на других ресурсах.

И, конечно же, если HTTP_REFERER является логином, проигнорируйте его и перенаправьте на ресурс индекса.

person netcoder    schedule 23.11.2010

Вы всегда должны проверять, что переменная $_SERVER['HTTP_REFERER'] содержит допустимые данные, так как ей нельзя доверять, поскольку пользовательские агенты предоставляют это значение.

Из руководства по php.net

The address of the page (if any) which referred the user agent to the current page. This is set by the user agent. Not all user agents will set this, and some provide the ability to modify HTTP_REFERER as a feature. In short, it cannot really be trusted. 
person K4emic    schedule 23.11.2010
comment
Это хороший момент. Вам также понадобится место по умолчанию для перехода, если у пользователя нет текущей страницы, на которую он пытается перейти. - person Jeff Davis; 23.11.2010

Вы можете позволить своей странице входа выполнить перенаправление за один проход (без перенаправления обратно на «страницу перенаправления»).

person Martin Schapendonk    schedule 23.11.2010