it-swarm.com.ru

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

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

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

Обновление

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

109
dayuloli

Сначала выполните эти обычные проверки:

  1. Убедитесь, что session_start(); вызывается до вызова любых сеансов. Поэтому безопаснее было бы поместить его в начало вашей страницы, сразу после открытия <?php, прежде чем что-либо еще. Также убедитесь, что перед открытием объявления <?php нет пробелов.
  2. После перенаправления header завершите текущий сценарий, используя exit(); (другие также предложили session_write_close(); и session_regenerate_id(true), вы также можете попробовать их, но я бы использовал exit();)
  3. Убедитесь, что куки включены в браузере, который вы используете для тестирования.
  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 - это путь к вашему домашнему каталогу. И конечно, убедитесь, что папка действительно существует в вашем корневом каталоге. (Некоторые программы не загружают пустые папки при синхронизации)

175
dayuloli

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

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

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

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

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

аннулировал куки сеанса

header("location: index.php")

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

13
ali al-juanidi

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

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

4
Jeremie

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

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

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

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

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

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

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

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

3
Stephen K. Karanja

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

session.use_cookies = 1 

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

3
sclarky

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

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

function sessionKill(){

    session_destroy();

}

чтобы:

function sessionKill(){

    session_destroy();
    session_start();

}

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

3
NicB

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

2
Wynn

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

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

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

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

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

1
Andy Huggins

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

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

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

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

1
Jayaprakash

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

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

1
Jeffrey Roosendaal

У меня была та же проблема, и я нашел самый простой способ .... Я просто перенаправил на .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;

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

Любовь Gram

1
Gramrock

Прежде всего, убедитесь, что вы вызываете 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())

0
F0G

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

0
almisoft

Сегодня у меня была эта проблема в проекте, и мне пришлось изменить этот параметр на false (или удалить строки, по умолчанию отключено):

ini_set( 'session.cookie_secure', 1 );

Это произошло потому, что реальный проект работает через http, а не только через https. Более подробную информацию можно найти в документации http://php.net/manual/en/session.security.ini.php

0
Oscar

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

RewriteEngine on
RewriteCond %{HTTP_Host} ^yoursitename.com$
RewriteRule ^.*$ "http\:\/\/www\.yoursitename\.com" [R=301,L]
0
Vishal Kumar
ini_set('session.save_path',realpath(dirname($_SERVER['DOCUMENT_ROOT']) . '/../session'));
session_start();

Слишком поздно, чтобы ответить, но это сработало для меня

0
ViperTecPro

У меня ничего не получалось, но я нашел причину проблемы (и решил ее):

Проверьте файлы cookie вашего браузера и убедитесь, что на разных поддоменах нет файлов cookie сеанса php (например, один для " www.website.com " и один для " website.com ").

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

0
Julius S.

Для меня это была ошибка разрешения, и это решило ее:

chown -R nginx: nginx/var/opt/remi/php73/lib/php/session

Я тестировал несколько часов на PHP, и последний тест, который я провел, - это создание двух файлов session1.php и session2.php.

session1.php:

session_start();

$_SESSION["user"] = 123;

header("Location: session2.php");

session2.php:

session_start();

print_r($_SESSION);

и он печатал пустой массив.

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

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

0
temo

Убедитесь, что session_write_close не вызывается между session_start() и когда вы устанавливаете сеанс.

session_start();

[...]

session_write_close();

[...]

$_SESSION['name']='Bob'; //<-- won't save
0
Jordan Daigle

Я исправил это, дав групповым разрешениям на запись путь, в котором PHP хранятся файлы сессий. Вы можете найти путь к сессии с помощью функции session_save_path ().

0
franzisk

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

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

0
Björn Tantau

Я исправил эту проблему после многих дней отладки, и все из-за того, что у моего обратного URL, полученного от Paypal Express Checkout, не было «www». Chrome признал, что к доменам следует относиться одинаково, но другие браузеры иногда этого не делают. При использовании сессий/файлов cookie и абсолютных путей не забывайте «www»!

0
miapuffia

Теперь, когда GDPR - вещь, люди, посещающие этот вопрос, вероятно, используют скрипт cookie. Ну, этот сценарий вызвал проблему для меня. По-видимому, PHP использует файл cookie с именем PHPSESSID для отслеживания сеанса. Если этот скрипт удалит его, вы потеряете ваши данные.

Я использовал этот скрипт cookie . Он имеет возможность включить «необходимые» куки. Я добавил PHPSESSID в список, скрипт перестал удалять cookie, и все снова заработало.

Возможно, вы могли бы включить некоторые настройки PHP, чтобы избежать использования PHPSESSID, но если причиной проблемы является ваш скрипт cookie, почему бы не исправить that.

0
Hristiyan Dodov

Если вы используете Laravel и у вас возникла эта проблема, вам нужно сохранить данные сеанса перед перенаправлением.

session()->save();
// Redirect the user to the authorization URL.
header('Location: ' . $authorizationUrl);
exit;
0
Aubrey Kodar

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

Я решил эту проблему, поместив перенаправление заголовка на другую страницу 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';
}

?>

Это не красивый обходной путь, но это сработало.

0
Stacker-flow

Просто для записи ... У меня была эта проблема, и после нескольких часов все попытки, проблема была в том, что диск был переполнен, и сеансы php не могли быть записаны в каталог tmp ... так что если у вас есть эта проблема, проверьте, что тоже...

0
iperich

У меня была та же проблема, и я сошел с ума, ища ответ в своем коде. Наконец, я обнаружил, что мой хостинг недавно обновил версию PHP на моем сервере и неправильно настроил параметр session_save_path в файле php.ini.

Так что, если кто-то читает это, пожалуйста, проверьте конфигурацию php.ini прежде чем что-либо еще. 

0
Yova Turnes

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

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