Сессия PHP потеряна после перенаправления

Как решить проблему потери сеанса после перенаправления в PHP?

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

Обновить

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

Сначала выполните следующие обычные проверки:

  1. Убедитесь, что session_start(); вызывается перед вызовом любых сеансов. Таким образом, безопасная ставка заключалась бы в том, чтобы разместить ее в начале вашей страницы сразу после открытия <?php объявления перед чем-либо еще. Также убедитесь, что перед открытием <?php декларации нет пробелов / вкладок.
  2. После перенаправления header завершите текущий скрипт, используя exit(); (Другие также предложили session_write_close(); и session_regenerate_id(true) , вы также можете попробовать их, но я бы использовал exit(); )
  3. Убедитесь, что файлы cookie включены в браузере, который вы используете, чтобы проверить его.
  4. Убедитесь, что register_globals выключен, вы можете проверить это в файле php.ini а также с помощью phpinfo() . Обратитесь к этому, как отключить его.
  5. Убедитесь, что вы не удалили или не очистили сеанс
  6. Убедитесь, что ключ в суперглобальном массиве $_SESSION не перезаписан нигде
  7. Убедитесь, что вы перенаправляетесь в тот же домен. Поэтому перенаправление с www.yourdomain.com на yourdomain.com не переносит сессию вперед.
  8. Убедитесь, что расширение файла .php (это случается!)

Теперь это самые распространенные ошибки, но если они не сделали этого, проблема, скорее всего, будет связана с вашей хостинговой компанией. Если все работает на localhost но не на вашем удаленном / тестовом сервере, то это, скорее всего, виновник. Поэтому проверьте базу знаний вашего хостинг-провайдера (также попробуйте их форумы и т. Д.). Для таких компаний, как FatCow и iPage, они требуют указать session_save_path . Ну вот так:

 session_save_path('"your home directory path"/cgi-bin/tmp'); session_start(); 

(замените «путь к домашнему каталогу» на ваш фактический путь к домашнему каталогу. Обычно это находится в вашей панели управления (или эквивалентной), но вы также можете создать файл test.php в корневом каталоге и ввести:

 <?php echo $_SERVER['SCRIPT_FILENAME']; ?> 

Бит до «test.php» – это путь к вашему домашнему каталогу. И, конечно же, убедитесь, что папка действительно существует в вашем корневом каталоге. (Некоторые программы не загружают пустые папки при синхронизации)

вы должны использовать «exit» после вызова заголовка

 header('Location: http://www.example.com/?blabla=blubb'); exit; 

Я пробовал все возможные решения, но никто не работал для меня! Конечно, я использую общедоступный хостинг.

В конце концов, я столкнулся с проблемой, используя «относительный URL» внутри заголовка перенаправления!

 header("location: http://example.com/index.php") 

аннулировать файлы cookie сеанса

 header("location: index.php") 

работал как шарм!

Это заставило меня долгое время (и этот пост был замечателен!), Но для тех, кто еще не может получать сеансы между переадресацией страниц на работу … Мне пришлось зайти в файл php.ini и включить файлы cookie на :

 session.use_cookies = 1 

Я думал, что сеансы работают без куки-файлов … на самом деле я знаю, что они ДОЛЖНЫ … но это исправляло мою проблему, по крайней мере, до тех пор, пока я не пойму, что может происходить в более широкой картине.

Я столкнулся с этой проблемой на одной конкретной странице. Я задавал значения $ _SESSION на других страницах перед перенаправлением, и все работало нормально. Но эта страница не работала.

Наконец, я понял, что на этой странице я уничтожал сессию в начале страницы, но не начинал ее снова. Поэтому моя функция уничтожения изменилась с:

 function sessionKill(){ session_destroy(); } 

чтобы:

 function sessionKill(){ session_destroy(); session_start(); } 

И все сработало!

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

В моем случае проблема была вызвана 404 из- за отсутствия favicon.ico только в Chrome и Firefox. Другие навигаторы отлично работали.

У меня была аналогичная проблема, хотя мой контекст был несколько иным. У меня была локальная настройка разработки на машине, чье имя хоста было windows а IP-адрес – 192.168.56.2 .

Я мог получить доступ к системе, используя любой из следующих:

После входа в систему мой PHP-код будет перенаправляться с использованием:

 header('http://windows/'); 

Если предыдущее имя домена, используемое для доступа к системе, не было windows , данные сеанса будут потеряны. Я решил это, изменив код на:

 header('http://'.$_SERVER['HTTP_HOST'].'/'); 

Теперь он работает независимо от того, какое локальное доменное имя или IP-адрес вводит пользователь.

Надеюсь, это может быть полезно кому-то.

У меня была такая же проблема. Неожиданно из моих переменных сеанса не сохранилась следующая страница. Проблема оказалась (в php7.1) у вашего заголовка не должно быть WWW, ex https: // mysite . это нормально, https: //www.mysite . потеряет эти переменные сеанса страницы. Не все, только эта страница.

У меня была такая же проблема, и я нашел самый простой способ. Я просто перенаправлен на перенаправление .html с 1 строкой JS

 <!DOCTYPE html> <html> <script type="text/javascript"> <!-- window.location = "admin_index.php"; //–> </script> </html> 

вместо PHP

 header_remove(); header('Location: admin_login.php'); die; 

Надеюсь, это поможет.

Любовь Грам

Если вы используете session_set_cookie_params() вы можете проверить, передаете ли вы четвертый param $secure как true . Если да, то вам нужно получить доступ к URL-адресу, используя https.

Параметр $secure являющийся истинным, означает, что сеанс доступен только в защищенном запросе. Это может повлиять на вас локально больше, чем на сцене или в производственной среде.

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

Таким образом, вы можете использовать https локально, или вы можете установить $secure param для FALSE а затем использовать http локально. Просто убедитесь, что вернулись к истине, когда вы подталкиваете свои изменения.

В зависимости от вашего локального сервера вам может потребоваться отредактировать DocumentRoot в httpd-ssl.conf сервера, чтобы ваш местный URL был отправлен https.

Другая возможная причина:

Это мое хранилище на сервере. Мое пространство на сервере становится полным. Итак, я удалил несколько файлов и папок на моем сервере и попытался.

Это сработало !!!

Я сохраняю сеанс в базе данных AWS Dynamo DB, но он все еще ожидает, что на моем сервере будет обработано некоторое пространство для обработки сеанса. Не знаю, почему !!!

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

Я решил это, поставив переадресацию заголовка на другую php-страницу «signin_action.php» и передав параметры переменных через нужные параметры url, а затем переназначив их в форме «signin_action.php».

signin.php

 if($stmt->num_rows>0) { $_SESSION['username'] = $_POST['username']; echo '<script>window.location.href = "http://'.$root.'/includes/functions/signin_action.php?username='.$_SESSION['username'].'";</script>'; error_reporting(E_ALL); 

signin_action.php

 <?php require('../../config/init.php'); $_SESSION['username'] = $_GET['username']; if ($_SESSION['username']) { echo '<script>window.location.href = "http://'.$root.'/user/index.php";</script>'; exit(); } else { echo 'Session not set'; } ?> 

Это не красивая работа, но она сработала.

Для меня ошибка заключалась в том, что я попытался сохранить несериализуемый объект в сеансе, чтобы исключение было создано при попытке написать сеанс. Но поскольку весь код обработки ошибок уже прекратил любую операцию, я никогда не видел ошибки.

Я мог бы найти его в журналах ошибок Apache.

Только для записи … У меня возникла эта проблема, и через несколько часов я попробовал все, что проблема была в том, что диск был заполнен, а сеансы php не могли быть записаны в каталог tmp … так что если у вас есть эта проблема, проверьте, что слишком…

Я боролся с этим в течение нескольких дней, проверяя / пытаясь все решения, но моя проблема заключалась в том, что я не вызывал session_start(); снова после перенаправления. Я просто предположил, что сеанс «все еще жив».

Так что не забывайте об этом!

Для меня Firefox хранит идентификатор сеанса (PHPSESSID) в файле cookie, но Google Chrome использует параметр GET или POST. Поэтому вам нужно только убедиться, что возвращаемый скрипт (для меня: paypal checkout) зафиксирует PHPSESSID в URL-адресе или параметре POST.

Попробовав много решений здесь на SO и других блогах … то, что сработало для меня, добавляло .htaccess к моему корню сайта.

 RewriteEngine on RewriteCond %{HTTP_HOST} ^yoursitename.com$ RewriteRule ^.*$ "http\:\/\/www\.yoursitename\.com" [R=301,L] 

Если вы используете WordPress, мне пришлось добавить этот крючок и начать сеанс в init:

 function register_my_session() { if (!session_id()) { session_start(); } } add_action('init', 'register_my_session'); 

Ничто не работало для меня, но я нашел причину проблемы (и решил ее):

Проверьте куки-файлы своего браузера и убедитесь, что в разных поддоменах нет файлов cookie php-сессии (например, для « http://www.website.com » и «для веб-сайта »).

Это было вызвано javascript, который неправильно использовал субдомен для установки файлов cookie и для открытия страниц в iframe.

Прежде всего, убедитесь, что вы вызываете session_start() перед использованием переменной $_SESSION .

Если вы отключили отчет об ошибках, попробуйте включить его и увидеть результат.

 ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); 

Наиболее распространенные причины, которые не упоминаются в ответе @ dayuloli:

  1. Проблема с дисковым пространством. Убедитесь, что ваше дисковое пространство не заполнено, вам нужно место для хранения файлов сеанса.

  2. Каталог сеанса не может быть доступен для записи. Вы можете проверить его с помощью is_writable(session_save_path())

Убедитесь, что новый сеанс создан правильно, сначала уничтожив старый сеанс.

  session_start(); // remove all session variables session_unset(); // destroy the session session_destroy(); session_start(); $_SESSION['username'] = 'username'; 

Да, session_start () вызывается дважды. Однажды вызовите команды unset и destroy и второй раз, чтобы начать новый сеанс.