Переменные сеанса не устанавливаются, но только в Internet Explorer и не на всех машинах - PullRequest
5 голосов
/ 19 мая 2010

Вход на сайт Я работаю над функциями, как и ожидалось, на моем локальном компьютере, но происходит сбой на удаленном сервере, но ТОЛЬКО в Internet Explorer. Главное, что он работает в IE локально, а не на удаленной машине.

Что в мире может вызвать это? Я прошел по коду на удаленной машине и вижу, что введенные значения входа проверяются в базе данных, они обнаруживаются и затем вызывается функция входа в систему. Это устанавливает две переменные $ _SESSION и перенаправляет на главную страницу администратора. Однако только в IE (а не при запуске на локальном компьютере ... это ключевой момент) переменные $ _SESSION отсутствуют, когда вы попадаете на главную страницу администратора. var_dump($_SESSION) дает мне то, что я ожидаю, в каждом браузере, когда я запускаю это в своей локальной среде и в каждом браузере, кроме IE 6, 7 и 8, при запуске на удаленном сервере (где я получаю нулевое значение, как будто ничего не установлено за $ _SESSION).

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

Для примера ... в IE, запустить локально, var_dump дает мне:

array
'Username' => string 'theusername' length=11
'UserID'   => string 'somevalue' length=9

Запуск на удаленном сервере (только IE ... отлично работает в других браузерах) var_dump дает мне:

array(0){}

Код (минимальный пример ... хотя на самом деле пример кода не нужен с этой проблемой):

$User = GetUser($Username, $Password);
    if ($User->UserID <> "") { // this works so we call Login()...
        Login($User); // this also works and gives expected results. on to redirect...
        header("Location: index.php"); // a var_dump at index.php shows that there is no session data at all in IE, remotely.
    } else {
        header("Location: login.php");
    }


function Login($data) {
        $_SESSION['Username'] = $data->Username;
        $_SESSION['UserID'] = $data->UserID;
// a var dump here gives the expected data in every browser
    }

РЕДАКТИРОВАТЬ: Решено это. Дело в том, что доменное имя на тестирующем сервере было подчеркнуто. Понятия не имею, почему, и сейчас у Google нет на это времени, но проблема заключалась в подчеркивании, названном что-то вроде some_client.ourcompany.com. Должен любить Internet Explorer ... это как пассивный агрессивный сотрудник, которого вы просто не можете избежать.

Ответы [ 5 ]

2 голосов
/ 03 октября 2011

Поместите это как ответ (предложенный пользователем tuzo), чтобы его было легче найти. Решил это. Дело в том, что доменное имя на тестирующем сервере было подчеркнуто. Понятия не имею, почему, и сейчас у Google нет на это времени, но проблема была в подчеркивании, названном что-то вроде some_client.ourcompany.com. Должен любить Internet Explorer ... это как пассивный агрессивный сотрудник, которого вы просто не можете избежать.

Взято из другого SO ответа ... объясняет точно, что происходит: Один из поддоменов использует подчеркивание? IE имеет проблемы с принятием файлов cookie с поддоменов, которые не соответствуют URI RFC. (http://www.ietf.org/rfc/rfc2396.txt)

1 голос
/ 19 мая 2010

Проверьте значение session.cookie_domain в вашем файле php.ini. Если это значение установлено, убедитесь, что это то, что вы ожидаете. Это самая большая вещь, о которой я могу думать, которая может вести себя по-разному локально и удаленно.

Также, если у вас установлено значение session.cookie_lifetime, попробуйте закомментировать эту строку в вашем php.ini. Я видел некоторое специфическое поведение с IE, когда я опустил туда значение.

Вот проверка на сессию. Если вы перезагрузите страницу и продолжите видеть новые значения для токена, вы не получите постоянный сеанс. Тогда вы определенно можете обвинить конфигурацию сервера / PHP, а не ваш код.

<?php
session_start();
if (!isset($_SESSION['token'])) {
    $_SESSION['token'] = sha1(uniqid(rand(), true));
}

if (!empty($_POST)) {
  $_SESSION['hi'] = preg_replace('/[^\w ]+/','',$_POST['hi']);
  header("Location: index.php");
  exit;
}

?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Session test</title>
</head>
<body>

<h1>How's that session doing?</h1>
<p>Message: <?=htmlspecialchars($_SESSION['hi'])?></p>
<p>Token: <?=htmlspecialchars($_SESSION['token'])?></p>


<form action="index.php" method="post">
<fieldset>
  <label for="hi">What do you have to say?</label>
  <input type="text" name="hi" id="hi">
  <input type="submit" value="Submit">
</fieldset>
</form>

</body>
</html>
1 голос
/ 15 февраля 2011

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

0 голосов
/ 28 января 2015

У нас возникла та же проблема, однако это были не символы имени сервера, а время сервера, которое было неправильным. Это привело к тому, что наши сессионные cookie-файлы мгновенно стали недействительными в IE, пока он работал в других браузерах.

0 голосов
/ 19 мая 2010

Попробуйте поставить session_start (); вверху страницы, где вы проводите сеансы. и проверьте, правильно ли вы присваиваете сеансовые переменные:

$_SESSION['SESSION_NAME'] = 'sessionValue';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...