我想开始说我已经搜索了很多这个问题。经过一个多星期的尝试解决它,我觉得我几乎都在那里。
是的,我确实放了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上,它从会话更改为另一个会话。这是非常的。以下是发生的事情:
当我使用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
答案 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.
子域的网站,而不是混合使用。
这通常也很好,因此您只有一个网站可以节省一些令人头疼的问题。