Как решить проблему потери сеанса после перенаправления в PHP?
Недавно я столкнулся с частой проблемой потери сеанса после перенаправления. И после поиска в сети я все еще не могу найти решение.
Ответ 1
Сначала выполните эти стандартные проверки:
Убедитесь, что session_start();вызывается перед вызовом каких-либо сеансов. Таким образом, беспроигрышный вариант — разместить его в начале вашей страницы сразу после открывающего <?php объявления, прежде чем выполнять что-либо еще. Также убедитесь, что перед открывающим <?php объявлением нет пробелов/табуляции.
После header перенаправления завершите текущий сценарий, используя exit();(также можно использовать, session_write_close(); или session_regenerate_id(true);).
Убедитесь, что файлы 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 файл в корневом каталоге и ввести:
<?php echo $_SERVER['SCRIPT_FILENAME']; ?>
И, конечно же, убедитесь, что папка действительно существует в вашем корневом каталоге (некоторые программы не выгружают пустые папки при синхронизации).
Ответ 2
Я перепробовал все возможные решения, но у меня ни одно не заработало! Конечно, я использую виртуальный хостинг.
В конце концов, я решил проблему, используя «относительный URL» внутри заголовка перенаправления!
header("location: http://example.com/index.php")
header("location: index.php")
Ответ 3
Когда я использую относительный путь "dir/file.php" с функцией header(), у меня все работает. Я думаю, что сеанс почему-то не сохраняется при перенаправлении с использованием полного url…
//По каким-то причинам сохраняет информацию о сеансе.
header("Location: dir");
//По каким-то причинам не сохраняет сессию.
header("Location: https://mywebz.com/dir")
Ответ 4
Я столкнулся с этой проблемой на одной конкретной странице. Я устанавливал значения $_SESSION на других страницах прямо перед перенаправлением, и все работало нормально. Но эта конкретная страница не работала.
Наконец я понял, что на этой конкретной странице я разрушал сеанс в начале страницы, но никогда не запускал его снова. Итак, моя функция уничтожения изменилась с:
function sessionKill(){
session_destroy();
}
На такую:
function sessionKill(){
session_destroy();
session_start();
}
И все заработало!
Ответ 5
У меня была такая же проблема, и я нашел самый простой способ. Я просто перенаправил на редирект .html с одной строкой JS:
<!DOCTYPE html>
<html>
<script type="text/javascript">
<!--
window.location = "admin_index.php";
//–>
</script>
</html>
вместо PHP
header_remove();
header('Location: admin_login.php');
die;
Надеюсь, это поможет.
Ответ 6
У меня была такая же проблема с неработающим перенаправлением, и я попробовал все решения, которые смог найти, мое перенаправление заголовка использовалось в форме.
Я решил эту проблему, поместив перенаправление заголовка на другую страницу 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 'Сессия не установлена';
}
?>
Это не красивый обходной путь, но он сработал.

Web