Подтвердить что ты не робот

Проблемы с Cookie/сессией CakePHP

У меня возникают проблемы с моим приложением CakePHP. Кажется, это происходит только в IE, и только на определенных компьютерах. Это согласовано на компьютерах, где это происходит.

Проблема 1: Пользователь вошел в систему и на странице https://example.com/users/view и щелкает выходы. Пользователь перенаправляется на http://example.com и, как представляется, выходит из системы, пока пользователь не посещает другую страницу https, и они все еще вошли в систему. Они могут щелкнуть выходить из системы столько раз, сколько они хотят, но они всегда регистрируются на https и только выходят из системы на http.

Проблема вторая: Пользователь регистрируется в https://example.com/users/signin, они перенаправляются на http://example.com и теперь, похоже, вошли в систему. Пользователь переходит на https://example.com/admin/slides и еще не знает об этом, но теперь вышел из системы, нажатие на любую другую страницу (или просто обновление их текущей страницы) попросит их снова войти в систему.

Я понятия не имею, что происходит. Я прочитал и опробовал решения, описанные по обеим аналогичным проблемам: Сессия не сохраняется при переходе с ssl на non-ssl и Cookie не обновляется/перезаписывается в IE, но у меня все еще есть те же проблемы.

Единственный ключ, который я заметил до сих пор (и я не знаю, означает ли это что-либо), когда я отлаживаю как $_SESSION, так и $this->Session->read() на HTTP-страницах ВСЕГДА только $this- > Session- > read ( ) возвращает значение. на HTTPS-страницах некоторые ВСЕГДА возвращают одинаковое значение для обоих, другие ВСЕГДА возвращают только значение $this- > Session- > read().

Например, http://example.com и https://example.com/users никогда не видит $_SESSION, https://example.com/carts всегда видит $_SESSION. Я не уверен, но я думаю, что, возможно, защищенные страницы должны видеть это, а так как некоторые не могут что-то не так, однако, когда я проверяю код, я не вижу никакой разницы, которая бы подсказывала, почему это делается, т.

Кроме того, если я добавлю $this->Session->destroy() в beforeFilter в AppController, тогда все страницы, даже HTTP, могут видеть $_SESSION. Я фактически не использую $_SESSION в своем приложении, я просто подумал, что это может быть ключом к ошибкам.


UPDATE

Я взял совет Густава Бертрама и посмотрел на строку пользовательского агента. Я сравнил строку пользовательского агента с IE на компьютере, на котором возникла проблема с IE на компьютере, который не имел проблемы. Они были теми же, за исключением тех, у кого были проблемы, есть "хром-фрейм Google" в строке пользовательского агента. Я удалил Google Chrome Frame с этого компьютера, перезапустил, снова попытался, и проблема, казалось, была решена.

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

4b9b3361

Ответ 1

Попробуйте добавить в файл core.php следующее:

Configure::write('Session.checkAgent', false);
Configure::write('Session.ini',array('session.cookie_secure' => false, 'session.referer_check' => false));

Эти параметры должны заставить cookie сохраняться даже через Google Chrome Frame. Это установит как настройки PHP, так и CakePHP, чтобы разрешить сохранение файлов cookie через http и https.

Ответ 2

Мое предложение состоит в том, что вы напрямую смотрите на пакеты, чтобы узнать, что происходит с файлами cookie.

Установите Wireshark на свой клиентский компьютер и подключитесь к удаленному веб-серверу. (Wireshark будет игнорировать трафик localhost.)

Мое подозрение в том, что ваши файлы cookie либо искалечены (у меня когда-то были некоторые файлы cookie, искаженные PHP!), либо они застревают (это будет ошибка IE). В любом случае у вас будет больше информации о том, что происходит не так.

В качестве последней меры проверьте строку user-agent в коде для неподдерживаемой/неподдерживаемой версии IE и попросите людей обновить.

Ответ 3

Попробуйте поместить это в свой AppController beforeFilter и посмотрите, не делает ли он что-либо. У меня такое ощущение, что настройки cookie не настроены так, как вам нужно. См. здесь для получения дополнительной информации.

function beforeFilter() {
    $this->Cookie->domain = '.example.com';
    $this->Cookie->secure = false;
}

Ответ 4

Вы уверены, что после закрытия php? > тега нет пробелов или новых строк? Возможно, это было первое, что вы проверили, но из опыта я знаю, что плохие закрытые теги php вызывают спорадические проблемы с обработкой сеанса php.