PHPSESSID未保存到cookie中。

6

PHPSESSID变量保存会话ID,但它没有被保存到客户端的cookie中。这导致每次调用session_start()函数时都会生成一个新的会话ID。

在使用FireFox、Opera和Chrome时确实如此。但是奇怪的是,在Safari上,此变量成功保存到cookie中,一切正常。

编辑:这里是通过phpinfo()查看的我的会话设置:

session settings via phpinfo

我的网站有子域名,并且我想在所有子域名中使用相同的会话。

第二次编辑:当我在主域上检查var_dump($_COOKIE);时,我可以在名为PHPSESSID的变量下找到会话ID,但是当我在子域上执行同样的操作时,我得到一个空的array()数组。


我认为这不是php.ini的问题,因为它只在某些浏览器上发生。您需要什么信息? - Yoav Kadosh
2
不,这可能是一个 .ini 问题,而 Safari 只是唯一一款足够宽容的浏览器,可以接受您的服务器发送的内容。 - Marc B
1
session.cookie_lifetime 需要大于 0。使用 ini_set 进行验证。在 session_start(); 前加入 ini_set('session.cookie_lifetime', 3600);。如果可以正常工作,修复你的 php.ini 文件。 - Shea
GET方式传递会话如何?或者使用数据库会话处理程序呢? - Gabriel Santos
谢谢@GabrielSantos,但我不想这么做。 - Yoav Kadosh
显示剩余4条评论
3个回答

3

看起来cookie的域名被设置为localhost。只有当您实际从localhost运行您的网站时才能正常工作。您需要将session.cookie_domain与您的域名匹配,可选地在其前面加上一个.(例如.example.com)以包括子域。


你说得对,在我的主域名(localhost)上运行良好,但即使设置了ini_set('session.cookie_domain', '.localhost' );,我在子域名(forum.localhost)仍然遇到问题。 - Yoav Kadosh

1

这并不适用于Yoav的情况,但可能适用于其他遇到类似问题的人:

不要忘记调用session_start()函数

听起来,如果客户端没有发送PHPSESSID cookie,session_start()将创建它并将其保存在cookie中。

来自php.net

当访问者访问您的站点时,PHP会自动检查(如果session.auto_start设置为1)或根据您的请求(通过session_start()显式地)是否已发送特定的会话ID。如果是这种情况,则重新创建先前保存的环境。

一些关于session_start()的好例子 http://php.net/manual/en/function.session-start.php


如果我手动删除了会话ID,这个工作还能正常运行吗? - Trần Hữu Hiền

0

我也遇到了同样的问题,我无法在Safari和Mac Os浏览器中登录我的用户,甚至Firefox也不行,只有在Chrome(PC,而非Mac)上才能登录。原因是在php.ini中的组合:

  1. session.cookie_lifetime=0
  2. session.cookie_domain=mydomain

其中0我改成了3600(合理),正如Shea所说,“mydomain”是错误的(全是我的错),因为它缺少“.com”,域名的正确名称应该是这个!

所以我最终将配置更改为:

  1. session.cookie_lifetime=3600
  2. session.cookie_domain=mydomain.com

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接