Почему куки исчезают в IE6 / 8, и что я могу с этим поделать? - PullRequest
1 голос
/ 30 июня 2009

У меня есть настройки входа в систему на сайте, который хранит информацию для входа в PHP в $ _SESSION и дополнительно устанавливает двухнедельный файл cookie с информацией для входа в систему, если установлен флажок. Пользователь считается вошедшим в систему, если действительная информация для входа либо отправлена ​​POST, либо файл cookie имеет значение true.

Поведение в FF3 / Chrome такое, как было задумано, по крайней мере с установленным флажком «Запомнить меня»: входите в систему везде и всюду на сайте, к которому вы относитесь, как к системе.

Однако кто-то, работающий с IE6, сказал, что она вошла в одно место, перебрала ссылки на другие разделы сайта, и ее попросили войти снова. У меня возникли некоторые проблемы с моим (Multiple IE) IE6, но я воспроизвел похожее поведение в IE8, включая настройку Advanced Privacy Settings-> Always allow сеансовые cookie-файлы и в противном случае установил разрешения на использование cookie-файлов настолько терпимыми, насколько мог. Поведение было идентичным: войдите в одно место таким образом, чтобы установить _SESSION и двухнедельный файл cookie, нажмите ссылки на другие страницы, и на странице появится экран входа в систему, поскольку он не распознает вас как вошедших в систему. PHP - это версия 5.2.8 на сервере Gentoo.

Есть предложения или ресурсы для получения распознанных файлов cookie?

-

[Добавлено после проверки трафика с помощью Fiddler:]

Спасибо; Я скачал Fiddler 2.

Fiddler сообщает Set-Cookie: [имя] = удалено ... в соответствующих выходах из системы. Я сейчас озадачен, почему. Включенный файл, который проверяет и отображает экран входа в систему, имеет только одну область, в которой он может удалить соответствующие файлы cookie, в условном случае, если установлено значение $ _GET ['logout']. Я не видел, чтобы это происходило, и когда я помещаю инструкцию error_log () в условные выражения перед инструкциями по удалению файлов cookie, дополнительные сообщения не регистрируются.

Ответы [ 5 ]

3 голосов
/ 30 июня 2009

Пара предложений

  • Попробуйте использовать Fiddler или аналогичный для проверки HTTP-запросов и ответов, чтобы увидеть отправку и передачу файлов cookie. Это позволяет лучше понять, что происходит
  • Попробуйте, чтобы ваше приложение выводило P3P-заголовок , например header('P3P: CP="CAO PSA OUR"');
2 голосов
/ 30 июня 2009

Одна тонкая вещь, которая может выскочить и укусить вас, заключается в том, что IE не допускает доменные имена с подчеркиванием (то есть: developer_1_test.example.com), в то время как другие браузеры позволяют вам сойти с рук. Вы вряд ли сможете сделать это в производственной среде, но это легко упустить в среде разработки, где вы настраиваете кучу vhosts для разных разработчиков / веток кода / и т.д.

1 голос
/ 03 июля 2009

В конечном итоге я обнаружил следующее: Firefox и IE вели себя по-разному, потому что они обрабатывали кеширование по-разному, когда отсутствующий документ находился в пределах 14-дневного срока действия Expires: установленные заголовки.

Firefox, по-видимому, один раз проверял отсутствие данных, а затем не запрашивал их снова.

IE, с другой стороны, продолжал проверять элемент, для которого таблица стилей дала неправильный путь, получил 404 страницы, а пользовательская страница 404 сделала шаблонное приглашение для входа в систему, которое вызвало выход пользователя из системы (возможно, не лучший шаблон). Я предполагаю, что таблица стилей была кэширована, но IE продолжал запрашивать отсутствующие элементы.

Так что это были различия кеширования плюс косвенное включение плюс поведение страницы 404.

1 голос
/ 30 июня 2009

Первое, что я проверяю, когда это происходит, это то, что параметр домена для функции setcookie () установлен правильно.

Я видел случаи, когда домен cookie установлен на «example.com», но доступ к сайту осуществляется через «www.example.com».

Например, если вы вошли на страницу example.com, а затем щелкнули ссылку, которая переместила вас на страницу www.example.com, вы больше не будете входить в систему.

Обходной путь - либо убедиться, что все ваши внутренние ссылки согласованы, либо что вы установили свой cookie с помощью «.example.com», который активирует cookie для всех поддоменов.

1 голос
/ 30 июня 2009

Вам нужно быть более конкретным. Узнайте, как именно вы можете повторить это поведение в обоих браузерах, и вы нашли свою ошибку. Например, может быть одна или две страницы, на которых вы не можете позвонить session_start().

Важно помнить, что, если ваша конкретная переменная $ _SESSION не отображается и вызывает перенаправление на ваш логин, скорее всего, это часть вашей системы, которая сломана.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...