0

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

是的,我确实把 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 上完美地工作了。更改域时会话 ID 和数据保持不变。但是 - 毫不奇怪 - 它不适用于 IE。

我不知道,因为理论上 PHP 不支持浏览器。因此,无论用户代理是什么,它都应该工作。

在 IE 上,它从一个会话变为另一个会话。这很奇怪。这是发生的事情:

  1. 我访问 mydomain.com/info1,它会将许多数据加载到 $_SESSION 中。
  2. 我访问 mydomain.com/info2,它会根据新数据覆盖 $_SESSION。到这里为止,一切都很完美。
  3. 但随机地,仅在 IE 上,有时会显示有关 /info1 的信息,然后突然又回到 /info2。

当我使用框架集时,我认为这是php.net的重要说明:

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

我做了没有框架集的新测试,它适用于所有浏览器,包括 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
4

1 回答 1

1

一些访问者不使用 www 访问我的网站,而其他访问者则使用。在整个访问过程中,他们可能会经历域的变化(从 mydomain.com 到 www.mydomain.com,反之亦然)我丢失了 $_SESSION 数据并且发生了许多错误。

这只是一个建议,我不知道,但可能会有所帮助。如果您有权访问,您可以在这里做的.htacces是规范化您的网站访问方式的 URL,尤其是在Mod_Rewrite的帮助下有或没有www的域部分:

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

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

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

于 2012-10-29T16:39:40.860 回答