由于IE上的框架集,PHP$\会话数据丢失

由于IE上的框架集,PHP$\会话数据丢失,php,internet-explorer,session,session-variables,frameset,Php,Internet Explorer,Session,Session Variables,Frameset,我想开始说,我已经为这个问题搜索了很多。经过一个多星期的努力,我发现我已经快到了 是的,我确实放了session\u start()-不仅仅是这个,因为我打开了session.auto\u start 有些访问者不使用www访问我的网站,有些则使用www。在整个访问过程中,他们可能会体验到域的变化(从mydomain.com到www.mydomain.com,反之亦然),我会丢失$\u会话数据,并发生许多错误 因此,我将此添加到我的代码中: session_write_close(session

我想开始说,我已经为这个问题搜索了很多。经过一个多星期的努力,我发现我已经快到了

是的,我确实放了session\u start()-不仅仅是这个,因为我打开了session.auto\u start

有些访问者不使用www访问我的网站,有些则使用www。在整个访问过程中,他们可能会体验到域的变化(从mydomain.com到www.mydomain.com,反之亦然),我会丢失$\u会话数据,并发生许多错误

因此,我将此添加到我的代码中:

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上,它从一个会话切换到另一个会话。这很奇怪。发生的情况如下:

  • 我访问了mydomain.com/info1,它将许多数据加载到$\u会话中
  • 我访问mydomain.com/info2,它会根据新数据相应地覆盖$\u会话。在这里之前,一切都是完美的
  • 但是随机的,仅在IE上,有时会显示关于/info1的信息,然后会返回到/info2
  • 在使用frameset时,我认为这是php.net中的一个重要注意事项:

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

    我在没有框架集的情况下做了新的测试,它在所有Borwser上都有效,包括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
    
    有些访问者不使用www访问我的网站,有些则使用www。在整个访问过程中,他们可能会体验到域的变化(从mydomain.com到www.mydomain.com,反之亦然),我会丢失$\u会话数据,并发生许多错误

    这只是一个建议,我不知道,但可能会有帮助。如果您有权访问
    .htacces
    ,您可以在此执行的操作是,在以下帮助下,规范您的网站的URL访问方式,特别是带有或不带www的域部分:

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


    这通常也是很好的,因此您只有一个域可以为站点节省一些麻烦。

    为什么<代码>因为IE上的框架集这是一个很好的例子,说明为什么没有人再使用框架了。@Sammitch:不太好。OP所关心的(引自PHP.net),这不会导致会话丢失,而是因为并行请求而阻塞请求。如果不了解更多关于框架集结构的信息,很难说出更多。对于您描述的案例“3”,它看起来像是当您已经在“3”时,
    /info2
    还没有被调用。这听起来可能有些深奥,但先到先得。了解更多关于您需要的结构和处理的信息可能会有所帮助。@Sammitch我现在无法更改整个前端代码。已经完成了。我没有能力做那件事。我只是想用后端编程来修复它。非常感谢@hakre,但我没有访问.htacess的权限。我只能通过控制面板添加RewriteRule,通过这种方法我不能添加RewriteCond,也不能同时使用last和redirect(选择多个标志)。无论如何,这不会解决我的问题,也许是一个很好的建议。谢谢对于你的问题,我也在下面评论了你的问题。如果不了解更多关于框架集结构和所需处理的信息,就没有什么可说的了。一种解决方案是,框架集由负责正确会话初始化的PHP文件生成。但很难说不知道更多。
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^example.com [NC]
    RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]