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

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

И я нашел, что это более вероятно, произойдет в IE, чем в FF ... странно.

+7

Можете ли вы разместить код? – SilentGhost

ответ

7

Возможно ли, что файлы cookie не включены?

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

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

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

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

Для получения более подробной информации см. Passing the Session ID.

+0

Благодарим за быстрый ответ. Можете ли вы мне немного объяснить? что меан "путем распространения SID"? Если это поместило больше света - только что выяснили, что в локальном хосте он работает нормально, но на сервере что-то идет не так. –

+0

Я обновил свой ответ, надеюсь, будет более ясным. –

+0

Вы очень понятные. Спасибо за помощь. К сожалению, это не помогло, и мои файлы cookie включены, и, как я уже сказал, на локальном хосте он отлично работает. Все еще я не могу понять, что заставило его сбросить сеанс. Есть ли другой способ сделать перенаправление в PHP без проблем с потерями переменных сеанса? Спасибо! –

2

Две мысли:

  1. ли session_start(), расположенный в верхней части сценариев, прежде, чем что-либо отправляется в браузер?
  2. Является ли домен точно таким же? www.mydomain.com re-directing to mydomain.com приведет к проблеме, которую вы описываете.
5

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

+0

Это решило мою проблему. – DudeOnRock

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

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

0

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

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

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

0

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

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

Исправление было установить параметр secure ложных до начала сессии была создана.

Я выполнил это с использованием session_set_cookie_params. Что-то вроде этого:

session_set_cookie_params([lifetime], [path], [domain], false, true); 
Смежные вопросы