Сессия PHP потеряна после перенаправления
Как решить проблему потери сеанса после перенаправления в PHP?
Недавно я столкнулся с очень распространенной проблемой потери сеанса после перенаправления. И после поиска по этому сайту я все еще не могу найти решения (хотя это и было самым близким).
Я нашел ответ, и я подумал, что отправлю его здесь, чтобы помочь кому-либо испытать ту же проблему.
Сначала выполните следующие обычные проверки:
- Убедитесь, что session_start(); вызывается перед вызовом любых сеансов. Таким образом, безопасная ставка заключалась бы в том, чтобы разместить ее в начале вашей страницы сразу после открытия
- После перенаправления header завершите текущий скрипт, используя exit(); (Другие также предложили session_write_close(); и session_regenerate_id(true) , вы также можете попробовать их, но я бы использовал exit(); )
- Убедитесь, что файлы cookie включены в браузере, который вы используете, чтобы проверить его.
- Убедитесь, что 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 в корневом каталоге и ввести:
Бит до «test.php» – это путь к вашему домашнему каталогу. И, конечно же, убедитесь, что папка действительно существует в вашем корневом каталоге. (Некоторые программы не загружают пустые папки при синхронизации)
вы должны использовать «exit» после вызова заголовка
header('Location: http://www.example.com/?blabla=blubb'); exit;
Я пробовал все возможные решения, но никто не работал для меня! Конечно, я использую общедоступный хостинг.
В конце концов, я столкнулся с проблемой, используя «относительный URL» внутри заголовка перенаправления!
header("location: http://example.com/index.php")
аннулировать файлы cookie сеанса
Это заставило меня долгое время (и этот пост был замечателен!), Но для тех, кто еще не может получать сеансы между переадресацией страниц на работу … Мне пришлось зайти в файл php.ini и включить файлы cookie на :
Я думал, что сеансы работают без куки-файлов … на самом деле я знаю, что они ДОЛЖНЫ … но это исправляло мою проблему, по крайней мере, до тех пор, пока я не пойму, что может происходить в более широкой картине.
Я столкнулся с этой проблемой на одной конкретной странице. Я задавал значения $ _SESSION на других страницах перед перенаправлением, и все работало нормально. Но эта страница не работала.
Наконец, я понял, что на этой странице я уничтожал сессию в начале страницы, но не начинал ее снова. Поэтому моя функция уничтожения изменилась с:
У меня такая же проблема. Я работал над ним несколько часов, и это сводило меня с ума.
В моем случае проблема была вызвана 404 из- за отсутствия favicon.ico только в Chrome и Firefox. Другие навигаторы отлично работали.
У меня была аналогичная проблема, хотя мой контекст был несколько иным. У меня была локальная настройка разработки на машине, чье имя хоста было windows а IP-адрес – 192.168.56.2 .
Я мог получить доступ к системе, используя любой из следующих:
После входа в систему мой PHP-код будет перенаправляться с использованием:
Если предыдущее имя домена, используемое для доступа к системе, не было windows , данные сеанса будут потеряны. Я решил это, изменив код на:
header('http://'.$_SERVER['HTTP_HOST'].'/');
Теперь он работает независимо от того, какое локальное доменное имя или IP-адрес вводит пользователь.
Надеюсь, это может быть полезно кому-то.
У меня была такая же проблема. Неожиданно из моих переменных сеанса не сохранилась следующая страница. Проблема оказалась (в php7.1) у вашего заголовка не должно быть WWW, ex https: // mysite . это нормально, https: //www.mysite . потеряет эти переменные сеанса страницы. Не все, только эта страница.
У меня была такая же проблема, и я нашел самый простой способ. Я просто перенаправлен на перенаправление .html с 1 строкой JS
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».
if($stmt->num_rows>0) < $_SESSION['username'] = $_POST['username']; echo ''; error_reporting(E_ALL);
signin_action.php
window.location.href = "http://'.$root.'/user/index.php";'; 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 % ^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 и второй раз, чтобы начать новый сеанс.