Как заставить переменные сеанса сохраняться в перенаправлении заголовков?
Мой перенаправление заголовка выглядит следующим образом: header("Location:./content/user_dash.php");
У меня есть session_start();
в верхней части каждой страницы.
Я попытался перед перенаправлением заголовка session_regenerate_id(true);
Я попытался перед своим заголовком и после перенаправления session_write_close();
Я попытался exit(0);
и die();
после перенаправления заголовка;
Я попробовал header("Location:./content/user_dash.php?PHPSESSID=".session_id());
Если я ВКЛЮЧАЮ конечную страницу, она работает (но я не могу это использовать), и когда я меняю ее на перенаправление, мои переменные перестают работать. Я проверил это с помощью цикла foreach через $ _SESSION, и он печатает, когда ВКЛЮЧАЕТ страницу, но не перенаправляет.
Я как бы вытягиваю свои волосы из-за этого, потому что мне действительно нужно использовать переменные сеанса после перенаправления.
Структура файла:
index.php = отправляет регистрационную форму => login_code.php = переадресация после установки сеанса vars => user_dash.php echos vars и ничего не отображается (пустые vars, если инструкция для echo if isset)
Я удалил перенаправления, и даже простые гиперссылки не переносят мои переменные сеанса на следующую страницу.
Прямой HTTP-заголовок:
*serverinfo*/login_code.php POST *serverinfo*/login_code.php HTTP/1.1 Host: server User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip, deflate Connection: keep-alive Referer: *serverinfo* Cookie: PHPSESSID=im7kid3isj1q9ft03a68s6d5i3 Content-Type: application/x-www-form-urlencoded Content-Length: 29 username=user&password=pass HTTP/1.1 200 OK Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Content-Type: text/html Expires: Thu, 19 Nov 1981 08:52:00 GMT Server: Microsoft-IIS/7.5 X-Powered-By: PHP/5.3.10, ASP.NET Date: Thu, 03 May 2012 16:24:54 GMT Content-Length: 159 ---------------------------------------------------------- *serverinfo*/content/admin_dash.php GET *serverinfo*/content/admin_dash.php HTTP/1.1 Host: server User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip, deflate Connection: keep-alive Cookie: PHPSESSID=im7kid3isj1q9ft03a68s6d5i3 HTTP/1.1 200 OK Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Content-Type: text/html Expires: Thu, 19 Nov 1981 08:52:00 GMT Server: Microsoft-IIS/7.5 X-Powered-By: PHP/5.3.10, ASP.NET Date: Thu, 03 May 2012 16:24:54 GMT Content-Length: 3474
Вам нужно отладить ваше приложение.
Это может быть сюрпризом для вас, но отладка занимает большую часть времени программистов. Итак, время, чтобы изучить некоторые реальные задания программистов.
header("Location:./content/user_dash.php?".session_name()."=".session_id());
используемый вместе с session_write_close()
является наиболее пуленепробиваемым способом
если он все еще не работает, начните отлаживать его.
спасибо за настройки ini. Я вижу 2 подозрительных
и я могу игнорировать некоторых, поскольку мне не платят за отладку вашего приложения, и у меня есть своя собственная работа. Поэтому я просто предлагаю сделать все настройки по умолчанию и никогда не прикасаться к ним, пока вы не узнаете, что вы делаете
Поместите session_start()
перед любым другим кодом, включая обычный текст.
<?php session_start(); ?> Hello<?php echo " ".$_SESSION['firstname']." ".$_SESSION['lastname'];?>.
Я нашел часть своей проблемы, поэтому переменные $ _SESSION, хотя и были установлены, не сохраняются в файле cookie вместе с идентификатором сеанса. Публикация нового вопроса по этой конкретной проблеме.
Мы можем решить эту проблему двумя способами
i. в настройках браузера Firefox измените символ Кодировка на "UTF-8"
ii. По PHP-коду на странице добавить
<?php header('Content-Type: text/html; charset=utf-8'); ?>
которые вы собираетесь опубликовать
Благодаря,
Суреш Рамакришнан
Работа с перенаправлениями и заголовком () + refresh / location может привести к обновлению session_id в зависимости от используемой структуры PHP:
По опыту, я обнаружил, что присвоение имени сеансу действительно помогает адресовать значения, поскольку имя_соединения предотвращает обновление session_id:
Читайте об этом: http://pt2.php.net/session_name
PHP ДО ВСЕХ ЭЛЕМЕНТОВ
// If session is not set, this will set it up with the defined name. // Session is then initialized. define("CONF_SESSION_NAME", 'my_session_named'); if (!isset($_SESSION)) { session_name(CONF_SESSION_NAME); session_start(); }
По моему опыту, это предотвращало столкновение сеансов с нескольких платформ в одном месте и помогало обойти проблемы header ().
Прочитав немного об этой конкретной проблеме, я заметил, что на bugs.php.net там было много разговоров об этом.
Решение, найденное в одном из вариантов, обсуждает эту проблему с тем, чтобы перенаправить пользователя с помощью META Refresh:
<meta http-equiv="refresh" content="0; url=http://example.com/">
Цитирование:
Чтобы PHP мог «найти» ранее установленную переменную сеанса, он должен иметь возможность идентифицировать клиента, правильно? Ну, метод по умолчанию, используемый для достижения этого, – это набор файлов cookie, когда вы начинаете сеанс. Поскольку он отображается, вы перенаправляете пользователя на единственную страницу участника, используя заголовок «Местоположение» на той же странице, с которой инициирован сеанс, cookie PHPSESSID не будет установлен. Таким образом, как только пользователь придет на единственную страницу участника, PHP не сможет идентифицировать пользователя. Их переменная сеанса все еще существует, но PHP не даст ее незнакомому человеку. 🙂
В основном, в вашем ответе HTTP, который включает в себя заголовок Set-Cookie, он должен быть регулярным ответом 200 OK, а не перенаправлением на уровне протокола. Если вам абсолютно необходимо иметь поведение, которое вы собираетесь здесь, вам нужно будет использовать мета-обновление для перенаправления. Да, это не так круто, но это единственный способ установить cookie и перенаправить клиента в тот же ответ. В противном случае вам придется передать значение cookie в URL-адресе, что может быть хорошим вариантом для вас на самом деле.