Данные PHP $_SESSION потеряны из-за фрейма в IE

Я хотел бы начать говорить, что я искал много для этой проблемы. После более чем недели попыток решить ее, я думаю, что я ПОЧТИ там.

Да, я ставлю session_start() - не только это, поскольку у меня есть session.auto_start!

Некоторые посетители заходят на мой сайт не используя www, а другие -. Поскольку во время посещения они могут изменить домен (с mydomain.com на www.mydomain.com и наоборот), я теряю данные $_SESSION, и возникает много ошибок.

Поэтому я добавляю это в мой код:

session_write_close(session_id());
ini_set('session.cookie_domain', '.mydomain.com');
session_set_cookie_params(0, '/', '.mydomain.com');
session_start();

После некоторых тестов у меня это прекрасно проснулось - с тех пор - на Chrome и Firefox. Идентификатор сеанса и данные остаются неизменными при смене домена. Но - без удивления - он не работает на IE.

Я понятия не имею, так как теоретически PHP не поддерживает браузер. Так что это должно работать независимо от того, какой пользовательский агент.

В IE он меняется от сеанса к другому. Это очень странно. Вот что происходит:

  1. Я захожу на mydomain.com/info1, и он загружает много данных в $_SESSION.
  2. Я захожу на mydomain.com/info2, и он переписывает $_SESSION в соответствии с новыми данными. До здесь все идеально.
  3. Но случайным образом, только в IE, иногда отображается информация о / info1 и, как ни странно, она возвращается в / info2.

Поскольку я использую frameset, я думаю, что это важное примечание от php.net:

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

Я сделал новые тесты без frameset, и он работал на всех браузерах, включая IE.

Вот моя конфигурация php для сессии:

Directive   Local Value Master Value
session.auto_start  On  On
session.bug_compat_42   On  On
session.bug_compat_warn On  On
session.cache_expire    240 240
session.cache_limiter   nocache nocache
session.cookie_domain   no value    no value
session.cookie_httponly Off Off
session.cookie_lifetime 0   0
session.cookie_path /   /
session.cookie_secure   Off Off
session.entropy_file    no value    no value
session.entropy_length  0   0
session.gc_divisor  100 100
session.gc_maxlifetime  1440    1440
session.gc_probability  1   1
session.hash_bits_per_character 4   4
session.hash_function   0   0
session.name    PHPSESSID   PHPSESSID
session.referer_check   no value    no value
session.save_handler    files   files
session.save_path   /tmp    /tmp
session.serialize_handler   php php
session.use_cookies On  On
session.use_only_cookies    Off Off
session.use_trans_sid   0   0

1 ответ

Некоторые посетители заходят на мой сайт не используя www, а другие -. Поскольку во время посещения они могут изменить домен (с mydomain.com на www.mydomain.com и наоборот), я теряю данные $_SESSION, и возникает много ошибок.

Это только предположение, я не знаю, но, вероятно, это помогает. Что вы могли бы сделать здесь, если у вас есть доступ к .htacces нормализует URL-адреса доступа к вашему сайту, особенно доменную часть с или без www с помощью Mod_Rewrite:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^example.com [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]

Этот пример будет гарантировать, что пользователи всегда будут использовать ваш сайт с www. поддомен вместо смеси.

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

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