CakePHP Cookie / Сессионные проблемы - PullRequest
20 голосов
/ 01 ноября 2011

У меня проблемы с приложением 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 на 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.Я не уверен, но я думаю, что, возможно, защищенные страницы должны видеть это, и, поскольку некоторые не могут, может быть, что-то не так, однако, когда я проверяю код, я не вижу разницы, которая бы подсказывала, почему кто-то делает, а кто-то нет ».t.

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


ОБНОВЛЕНИЕ

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

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

Ответы [ 4 ]

17 голосов
/ 12 ноября 2011

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

6 голосов
/ 09 ноября 2011

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

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

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

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

0 голосов
/ 11 ноября 2011

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

function beforeFilter() {
    $this->Cookie->domain = '.example.com';
    $this->Cookie->secure = false;
}
0 голосов
/ 11 ноября 2011

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

...