CakePHP Cookie/ Сессионные проблемы

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

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


ОБНОВИТЬ

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

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

4 ответа

Решение

Попробуйте добавить следующее в файл 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.

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

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

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

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

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

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

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

Другие вопросы по тегам