Данные 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 он меняется от сеанса к другому. Это очень странно. Вот что происходит:
- Я захожу на mydomain.com/info1, и он загружает много данных в $_SESSION.
- Я захожу на mydomain.com/info2, и он переписывает $_SESSION в соответствии с новыми данными. До здесь все идеально.
- Но случайным образом, только в 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.
поддомен вместо смеси.
Это также обычно хорошо, так что у вас есть только один домен для сайта, который может избавить вас от головной боли.