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

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

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

Ответы

Ответ 1

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

Ответ 2

Как уже упоминалось, убедитесь, что вы вызываете 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, как я сначала предложил.

Ответ 3

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

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

3. Если сеанс работает нормально, и у вас есть проблемы только с токеном, тогда проверьте маркер, отправленный в url, url_encoded.

Ответ 4

это не проблема сервера хостинга...

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

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

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

RewriteEngine On

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

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

(замените hemantjadhav своим доменным именем)

Ответ 5

Проверьте размер файла сеанса: (код, взятый из этого сообщения)

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

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

Проверьте дисковое пространство с df -h на сервере linux.

Ответ 6

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

Ответ 7

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

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

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

Ответ 8

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

unset req.http.cookie;

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