Переменные сеанса не сохраняются между загрузками страниц - PullRequest
18 голосов
/ 01 июня 2011

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

<?
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>

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

Ответы [ 9 ]

17 голосов
/ 01 июня 2011

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

7 голосов
/ 01 июня 2011

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

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

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

3 голосов
/ 17 июля 2013

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

проверьте ваши 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 на ваше доменное имя)

1 голос
/ 22 августа 2012

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

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

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

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

1 голос
/ 22 августа 2011

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

0 голосов
/ 12 апреля 2019

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

unset req.http.cookie;

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

0 голосов
/ 12 марта 2019

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

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

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

0 голосов
/ 17 февраля 2014

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

0 голосов
/ 01 июня 2011

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

...