Переменные сеанса не сохраняются между загрузками страниц

Может кто-нибудь сказать мне, почему переменные сеанса не проходят между страницами? Они работали до 2 дней назад. Теперь его нет? Существует сторонняя система, которая регистрирует пользователей на основе сторонней системы. Я направляю пользователей на страницу входа с обратным URL. Сторонняя система регистрирует пользователя и передает его идентификатор и токен, сгенерированный на их конце, и возвращает их на мой сайт с идентификатором и токеном в URL-адресе.

Если сеансы не установлены, я пытаюсь получить идентификатор и токен из URL-адреса и установить сеансы. (работает) Затем я генерирую свой собственный токен для проверки по токену, переданному из сторонней системы (работает), когда я перехожу, чтобы перейти на другую страницу, сеансы, которые я установил, не пусты (????)

Вот мой код:

    <?php
    session_start();

    // FUNCTION TO PASS THE URL THE USER IS ON SO THEY COME 
    // BACk TO THIS PAGE AFTER THE LOG IN. IF APPLICABLE
    function curPageURL() {
    $pageURL = 'http';
    if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
    $pageURL .= "://";
    if ($_SERVER["SERVER_PORT"] != "80") {
    $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
    } else {
    $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
    }
    return $pageURL;
    }

    // DESTROY SESSION INFO IF TIMED OUT
    if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) {
    session_destroy();   // destroy session data in storage
    session_unset();     // unset $_SESSION variable for the runtime
    }

    // SET THE SESSIONS WITH INFO PASSED FROM
    // LOGIN PAGE SENT AS A GET
    if(isset($_SESSION['ID']) && isset($_SESSION['token'])) {}else{
    $_SESSION['ID'] = $_GET['ID'];
    $_SESSION['token'] = $_GET['token'];
    }

    // GENERATE MY TOKEN TO MATCH THE LOGIN SYSTEM TOKEN
    $userIP = $_SERVER['REMOTE_ADDR'];
    $secretkey = 'A Unique Key For The Logged In User Matching the Login System Passed From mydomain.com/login.php';
    $algorithm = 'md5';
    $mm = date('m');
    $dd = date('d');
    $mmdd = $mm.$dd;
    $mytoken = strtoupper(hash($algorithm, $secretkey.$_SESSION['ID'].$userIP.$mmdd));


    $_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp
    // THIS IS WHERE THINGS ARE GOING WRONG
// SESSION token IS NO LONG SET AFTER I Go To another page
// and my token isnt the same any more either because session ID
// is no longer set???
    if($_SESSION['token']==$mytoken){}else{
    header("location: https://mydomain.com/login.php?returnURL=".curPageURL());
    }
    ?>

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

<?
session_start();

$_SESSION['ID'] = "112233";
$_SESSION['token'] = "mytoken";

print $_SESSION['ID'];
print $_SESSION['token'];
?>
<a href="info2.php">info 2</a>

и один называется info2 с этим кодом:

<?
session_start();

print $_SESSION['ID'];
print $_SESSION['token'];
?>
<a href="info.php">info</a>

информация создана и распечатана сеанс в порядке. когда я нажимаю на ссылку, чтобы перейти к информации 2, сеансы не печатаются. Это проблема конфигурации хостинга?


person user520300    schedule 01.06.2011    source источник
comment
У меня точно такая же проблема... за исключением того, что мои вещи находятся на локальном хосте, используя PHP с IIS   -  person Thomas An    schedule 20.10.2015


Ответы (12)


Как уже упоминалось, убедитесь, что вы вызываете session_start() на каждой странице.

Кроме того, скрипты находятся на разных поддоменах?? Если это так, вы должны установить значение INI с session.cookie_domain на .DOMAIN.EXT.

Чтобы еще больше отладить всю эту ситуацию, выполните простой просмотр файлов cookie. Посмотрите, присутствует ли PHPSESSID в виде файла cookie на обоих запросах страницы, если нет, то это ваша проблема. Вы не можете хранить файлы cookie между доменами, если не восстановите их.


В ответ на ваше обновление попробуйте сделать это под своим вызовом session_start():

echo session_id();

Убедитесь, что он одинаков на обеих страницах. Если нет, проверьте значение session.cookie_domain следующим образом:

echo ini_get('session.cookie_domain');

Это настроено на что-нибудь? По умолчанию он должен быть пустым, если он установлен, особенно не на ваш домен, в этом проблема.

Вы также можете попробовать отладить значение файла cookie PHPSESSID, как я впервые предложил.

person Rudi Visser    schedule 01.06.2011
comment
см. мое дополнение к исходному сообщению - person user520300; 01.06.2011
comment
я еще не пробовал это, но буду. Вопрос... если по умолчанию echo ini_get('session.cookie_domain'); не пусто и это не мой домен, что мне делать? - person user520300; 01.06.2011
comment
2 варианта, 1: Обратитесь к вашему хостинг-провайдеру, потому что это неправильно, 2: Вы можете использовать ini_set('session.cookie_domain', '.your.domain'); или ini_set('session.cookie_domain', ''); перед session_start(). - person Rudi Visser; 01.06.2011
comment
As already mentioned, ensure you're calling session_start() on each page., всегда простой ответ, который ускользает от меня. Ура, Руди, спасибо тебе за очки!! - person Blatant; 20.12.2016
comment
Я проверил все это и до сих пор не могу сохранить сеанс. Я вижу установленный PHPSESSID, но мои переменные $_SESSION не переносятся на загрузку следующей страницы. - person Nick Rolando; 15.01.2019

Контрольный список
1. Убедитесь, что вы использовали session_start(); на следующей странице.

2. Используете ли вы файл .htaccess?
если да, удалите файл .htaccess и проверьте его.
время от времени правила перезаписи вызывают проблемы с сеансом...

3. Если сессия работает нормально, и у вас проблемы только с токеном, проверьте, что токен, отправленный в URL-адресе, закодирован в url_encoded.

person Jagadeesan    schedule 01.06.2011
comment
Я проверил дополнение. эта проблема может быть из-за конфигурации сервера. уточните у своего хостинг-провайдера. - person Jagadeesan; 06.06.2011
comment
Действительно, наличие файла .htaccess было причиной сбоя функции session_start() и возврата false. Вау, это очень тонко и коварно! Спасибо, теперь это работает. - person IVSoftware; 24.06.2020

дело не в хостинге...

проверьте свои URL-адреса

если пользователь входит в систему под «example.com», сеанс будет сохранен для «example.com», а не для «WWW.example.com», поэтому, если ссылка ведет на www.example.com, у него не будет этого сеанса.

вы можете использовать htaccess, чтобы всегда устанавливать URL-адрес «WWW.example.com», используйте для него приведенный ниже код.

RewriteEngine включен

RewriteCond %{HTTP_HOST} ^hemantjadhav.com$ [NC]

RewriteRule ^(.*)$ http://www.hemantjadhav.com/$1 [L,R=301 ]

(замените hemantjadhav на ваше доменное имя)

person Hemant Jadhav    schedule 17.07.2013
comment
Вот и все, проверьте свои URL-адреса! Я рвал на себе волосы и не понимал, что храню с двух разных сайтов. Один с www другой без. - person Learner33; 22.04.2021

Ответ на этот вопрос - это ошибка конфигурации хостинга. Хостинговая компания что-то изменила, и с тех пор это работает.

person user520300    schedule 22.08.2011
comment
Было бы неплохо узнать, что это было. - person Bernhard; 14.01.2019
comment
в моем случае это также была проблема с хостингом, это был файл htaccess, который они изменили и добавили некоторые новые правила для определенных версий php, кажется, что htaccess создавал путаницу между страницами и версиями php, установленными на сервере. - person Vikas Kandari; 21.10.2020

Проверьте размер файла сеанса: (код взят из этот пост )

$sessionfile = ini_get('session.save_path') . '/' . 'sess_'.session_id();  
echo 'session file: ', $sessionfile, ' ';  
echo 'size: ', filesize($sessionfile), "\n";

Если ваш файл сеанса имеет нулевой размер, убедитесь, что на вашем сервере все еще есть свободное место на диске. Это была проблема, которая у меня была.

Проверьте место на диске с помощью df -h на сервере Linux.

person grayob    schedule 22.08.2012
comment
благодаря вам я увидел, что у моей папки нет правильных прав доступа. - person user2203384; 12.08.2019

Единственный ответ на эту проблему — использовать session_start(); вверху каждой страницы. Это будет работать нормально. В противном случае вам может потребоваться связаться с вашим хостинг-провайдером по поводу этой проблемы.

person eldhose    schedule 12.09.2019
comment
Отвечая на вопрос восьмилетней давности с девятью существующими ответами, полезно объяснить, к какому новому аспекту вопроса относится ваш ответ. Также обратите внимание, сработал бы ли ответ, когда был задан вопрос, или он зависит от чего-то, что изменилось за эти восемь лет. - person Jason Aller; 12.09.2019

В моем случае решение состояло в том, чтобы иметь разные имена параметров в $_GET и $_SESSION.

$_SESSION["businessid"] = $_GET["businessid"]; // Leads to problems with session. $_SESSION["business_id"] = $_GET["businessid"]; //Works perfectly.

Звучит странно, но это мой опыт.

person D.Sari    schedule 12.03.2019

Я бы добавил, что я столкнулся с той же проблемой, за исключением того, что в моем случае страница находилась за кеширующим прокси-сервером Varnish, и я пропустил, что в конфигурации есть строка, в которой файлы cookie разрешены только на определенных путях, иначе они будут удалены с помощью следующей директивы:

unset req.http.cookie;

Не забудьте также проверить настройки прокси-сервера.

person bpile    schedule 12.04.2019

У меня было session.cookie_samesite = "Strict" в моем файле времени выполнения, и я пытался вернуть моего пользователя с Oauth2.0 обратно на мой сайт, и идентификатор сеанса PHP стирался, когда происходили перенаправления. Я удалил это из своего файла времени выполнения, и теперь он работает нормально.

person Garrick Crouch    schedule 22.02.2020

Для тех, кто ищет это в разочаровании - еще одна вещь, которую нужно проверить, - это настройка cookie_secure в php.ini.

Если cookie_secure=1, файлы cookie будут отправляться и сохраняться только при защищенных соединениях. В нашем случае сайт был развернут в среде, в которой еще не было настроено ssl.

Установите для cookie_secure значение по умолчанию (0) или защитите сайт.

person Matt Campbell    schedule 03.06.2021

Убедитесь, что обе страницы находятся в одном домене. Даже www.site.com отличается от site.com.

person user3225121    schedule 17.02.2014

Вы не вызвали session_write_close()

person Jage    schedule 01.06.2011
comment
Скорее всего, это будет в самом конце вашего сценария. Он записывает данные сеанса и закрывает сеанс, поэтому всякий раз, когда вы закончите с сеансом, все в порядке. Я предлагаю только самый конец, поскольку session_start() — это самое первое, что вы делаете. - person Jage; 01.06.2011
comment
пробовал... не получилось. когда я иду, нажмите, чтобы перейти на другую страницу, мои сеансы все еще пусты - person user520300; 01.06.2011
comment
Ему совершенно не нужно этого делать. - person Rudi Visser; 01.06.2011
comment
Соглашаясь с @rudi_visser: php.net/session_write_close — данные сеанса обычно сохраняются после завершения вашего скрипта без необходимости вызвать session_write_close(). - person ; 01.06.2011
comment
см. мое дополнение к исходному сообщению - person user520300; 01.06.2011