Ответ 1
Ответ на это - это ошибка конфигурации хостинга. Хостинг компания что-то изменила, и с тех пор она работает.
Может кто-нибудь сказать мне, почему сеансовые вары не проходят между страницами? Они работали до 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, сеансы не печатаются. Это проблема с конфигурацией хостинга?
Ответ на это - это ошибка конфигурации хостинга. Хостинг компания что-то изменила, и с тех пор она работает.
Как уже упоминалось, убедитесь, что вы вызываете 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
, как я сначала предложил.
Контрольный список
1. Убедитесь, что вы использовали session_start(); на следующей странице.
2. Используете ли вы файл .htaccess?
если так удалить файл .htaccess и проверить его.
некоторые правила перезаписи времени вызывают проблемы сеанса...
3. Если сеанс работает нормально, и у вас есть проблемы только с токеном, тогда проверьте маркер, отправленный в url, url_encoded.
это не проблема сервера хостинга...
проверьте свои 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 своим доменным именем)
Проверьте размер файла сеанса: (код, взятый из этого сообщения)
$sessionfile = ini_get('session.save_path') . '/' . 'sess_'.session_id();
echo 'session file: ', $sessionfile, ' ';
echo 'size: ', filesize($sessionfile), "\n";
Если ваш файл сеанса имеет нулевой размер, убедитесь, что на вашем сервере все еще есть свободное место на диске. Это была проблема, которую я имел.
Проверьте дисковое пространство с df -h
на сервере linux.
Убедитесь, что обе страницы находятся в одном домене. Даже www.site.com отличается от site.com
В моем случае решение состояло в том, чтобы иметь разные имена параметров в $ _GET и $ _SESSION.
$_SESSION["businessid"] = $_GET["businessid"];//Leads to problems with session.
$_SESSION["business_id"] = $_GET["businessid"];//Works perfectly.
Звучит странно, но это мой опыт.
Я хотел бы добавить, что я столкнулся с той же проблемой, за исключением того, что в моем случае страница была за Varnish, и я пропустил, что в конфигурации была строка, где куки разрешены только на определенных путях, в противном случае они были удалены с помощью следующей директивы:
unset req.http.cookie;
Не забудьте также проверить настройки прокси.
Вы не вызывали session_write_close()