由于IE上的frameset,PHP $ _SESSION数据丢失了

时间:2012-10-29 15:46:41

标签: php internet-explorer session session-variables frameset

我想开始说我已经搜索了很多这个问题。经过一个多星期的尝试解决它,我觉得我几乎都在那里。

是的,我确实放了session_start() - 不仅如此,因为我有session.auto_start On!

有些访问者访问我的网站时不使用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上完美地完成了这项工作。更改域时,会话ID和数据保持不变。但是 - 毫不奇怪 - 它不适用于IE。

我不知道,因为从理论上讲,PHP不会带有浏览器。因此无论用户代理是什么,它都会受到影响。

在IE上,它从会话更改为另一个会话。这是非常的。以下是发生的事情:

  1. 我访问mydomain.com/info1并将许多数据加载到$ _SESSION。
  2. 我访问mydomain.com/info2并相应地将$ _SESSION覆盖到新数据。在此之前,一切都很完美。
  3. 但是随机地,只有在IE上,有时候关于/ info1的信息显示和苏丹,它会回到/ info2。
  4. 当我使用frameset时,我认为这是来自 php.net 的一个重要说明:

      

    会话数据通常在脚本终止后存储,无需调用session_write_close(),但由于会话数据被锁定以防止并发写入,因此任何时候只有一个脚本可以在会话上运行。将框架集与会话一起使用时,由于此锁定,您将体验到逐个加载的框架。只要对会话变量进行了所有更改,就可以通过结束会话来减少加载所有帧所需的时间。

    我在没有框架集的情况下进行了新的测试,它适用于所有的borwsers,包括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 个答案:

答案 0 :(得分:1)

  

有些访问者访问我的网站时不使用www而其他人访问我的网站。在整个访问期间,他们可能会在域名中进行更改(从mydomain.com到www.mydomain.com,反之亦然)我会丢失$ _SESSION数据,并且会发生许多错误。

这只是一个建议,我不知道,但可能有帮助。如果您有权访问.htacces,您可以在此处执行的操作是规范网址的访问方式,尤其是在Mod_Rewrite的帮助下,有或没有 www 的域名部分:

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

此示例将确保用户始终使用包含www.子域的网站,而不是混合使用。

这通常也很好,因此您只有一个网站可以节省一些令人头疼的问题。