浏览器发送两个 Cookie - PHP 的 Session 处理程序读错了一个

Browser Sends Two Cookies - PHP's Session Handler Reads Wrong One

一段时间以来,在单个站点上设置了 cookie,并为 domain 设置了不同的值。这导致一些人为 .www.domain.com.domain.com 设置了同名的 cookie。该站点旨在以 www.domain.com 的形式访问。这是通过 .htaccess 规则完成的。

代码将使用 .domain.com。现在 session.cookie_domain 前进。

我遇到的问题是,当两个 cookie 都存在时,浏览器会同时发送(均有效)。我在 headers 中以及转储 apache_request_headers() 时也是如此,但是,当我转储 $_COOKIE 时,我只看到其中一个。

["Cookie"]=>
  string(74) "foobar=hkej4qdnq5kismiq3kl07qv6k2; foobar=ocvn7anlu2f2k2l37nl9ou3c21"

然后...

array(1) { ["foobar"]=> string(26) "hkej4qdnq5kismiq3kl07qv6k2" } 

我的 session 界面 read($id) 方法正在检查旧 cookie,而不是我们在登录时设置的 cookie。

解决这个问题的最佳方法是什么?我想我可以更改 session name/identifier 并重新开始。或者在我的 read 实现中评估 Apache headers。我没有找到太多与搜索网络相关的内容,只是来自 w3schools 的一堆乱七八糟的东西污染了结果,所以我认为这对 post 来说可能是一个很好的选择。

我遇到了同样的问题,通过更改会话名称解决了。

PHP 允许您访问变量 $_SERVER["HTTP_COOKIE"] 并自行解析它。这允许您访问 cookie 的两个值,但您仍然无法区分正确和错误的 cookie。

除非那些 cookie 包含真正有价值的数据,否则我不会在意旧值,而是开始新值。

只需将会话名称从 PHPSESSID 更改为 SITESESSID 或您选择的其他名称。这将确保您的应用程序完全忽略旧 cookie。如果您的会话的生命周期为 0,那么它是一个 SESSION Cookie(在浏览器关闭时被删除),在这种情况下,您可以在几天或一个月的实施后将会话名称更改回 PHPSESSID,因为您将确定没有人有旧饼干。

顺便说一句:浏览器没有发送两个 cookie。这只是您的旧会话 cookie 还活着。