Как решить проблему потери сеанса после перенаправления в PHP?
Недавно я столкнулся с очень распространенной проблемой потери сеанса после перенаправления. И после поиска по этому сайту я все еще не могу найти решения (хотя это и было самым близким).
Обновить
Я нашел ответ, и я подумал, что отправлю его здесь, чтобы помочь кому-либо испытать ту же проблему.
Сначала выполните следующие обычные проверки:
session_start();
вызывается перед вызовом любых сеансов. Таким образом, безопасная ставка заключалась бы в том, чтобы разместить ее в начале вашей страницы сразу после открытия <?php
объявления перед чем-либо еще. Также убедитесь, что перед открытием <?php
декларации нет пробелов / вкладок. header
завершите текущий скрипт, используя exit();
(Другие также предложили session_write_close();
и session_regenerate_id(true)
, вы также можете попробовать их, но я бы использовал exit();
) register_globals
выключен, вы можете проверить это в файле php.ini
а также с помощью phpinfo()
. Обратитесь к этому, как отключить его. $_SESSION
не перезаписан нигде www.yourdomain.com
на yourdomain.com
не переносит сессию вперед. .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:
Проблема с дисковым пространством. Убедитесь, что ваше дисковое пространство не заполнено, вам нужно место для хранения файлов сеанса.
Каталог сеанса не может быть доступен для записи. Вы можете проверить его с помощью 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 и второй раз, чтобы начать новый сеанс.