Потеря переменных сеанса после перенаправления - PullRequest
3 голосов
/ 07 декабря 2009
  1. Пользователь вводит имя пользователя и пароль.
  2. Если это правильно, страница загружает некоторую информацию, например user_id, в переменную сеанса.
  3. Сценарий выполняет перенаправление header('Location').
  4. Каким-то образом следующая страница не распознает сессию ... как получилось?

Перенаправление на тот же домен, и все страницы имеют session_start();

И я обнаружил, что в IE это происходит чаще, чем в FF ... странно.

Ответы [ 6 ]

7 голосов
/ 07 декабря 2009

Возможно ли, что куки не включены?

Чтобы иметь возможность связывать переменные сеанса с конкретным экземпляром клиента (т. Е. Как переменные сеанса могут использоваться в вашем браузере и в моем браузере одновременно, не вступая в конфликт), "идентификатор сеанса" (или «SID») генерируется за сеанс. Этот идентификатор хранится на сервере, а также на клиенте, обычно в форме файла cookie. Однако, если куки не включены, идентификатор сеанса передается как часть строки запроса URL-адреса в каждом запросе, чтобы сервер мог знать, какой идентификатор сеанса принадлежит клиенту.

Когда вы перенаправляете вызовом header(), PHP автоматически не вставляет SID в новый запрос, поэтому вам нужно будет добавить его самостоятельно в виде:

header("Location: my_url.com/my_page.php?" . SID)

где SID - это константа, определенная PHP, которая содержит необходимую часть строки запроса (эквивалентна session_name() . '=' . session_id(), если существует идентификатор сеанса).

См. Передача идентификатора сеанса для получения более подробной информации.

5 голосов
/ 11 мая 2010

У меня только что была похожая проблема, решение было просто добавить exit (); инструкция под заголовком (..) перенаправление.

2 голосов
/ 07 декабря 2009

Две мысли:

  1. Находится ли session_start () в верхней части скриптов перед отправкой чего-либо в браузер?
  2. Домен точно такой же? Перенаправление www.mydomain.com на mydomain.com приведет к описанной вами проблеме.
1 голос
/ 07 июля 2010
header("Location: my_url.com/my_page.php?" . SID)
exit();

Это сработало только после того, как я добавил exit() ниже header();

0 голосов
/ 31 августа 2014

У меня была эта проблема сегодня, и я искал способ ее исправить. У меня уже было то, о чем говорили все остальные, и я нигде не мог найти ответ.

В конце концов я нашел ответ после просмотра переменных сеанса с Firebug. Я заметил, что на страницах, где переменные терялись, сессия Parameter:secure была установлена ​​на true по какой-то неизвестной мне причине.

Исправление было , для параметра secure установлено значение false до создания сеанса.

Я сделал это, используя session_set_cookie_params. Примерно так:

session_set_cookie_params([lifetime], [path], [domain], false, true);
0 голосов
/ 08 июня 2013

Документация WordPress гласит, что куки будут удалены, если пароль пользователя будет изменен. Это убьет сеанс, независимо от того, произойдет ли перенаправление. До тех пор, пока вы можете предотвратить очистку файлов cookie (и exit() может сделать это, как предлагается в других ответах), сеанс не должен сохраняться.

Примечание. Если пароль текущего пользователя обновляется, файлы cookie будет очищено!

http://codex.wordpress.org/Function_Reference/wp_update_user

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...