浏览器发送两个Cookie - PHP的会话处理程序读取错误的一个

时间:2015-05-07 18:49:08

标签: php apache session cookies

在一段时间内,Cookie设置在domain的不同值的单个网站上。这导致一些人拥有为.www.domain.com.domain.com设置相同名称的Cookie。该网站旨在作为www.domain.com访问。这是通过.htaccess规则完成的。

代码将使用.domain.com。现在为session.cookie_domain向前发展。

我遇到的问题是,当两个cookie都存在时,浏览器会发送两者(两者都有效)。我在标题中看到了这一点,并且在转出apache_request_headers()时也是如此,但当我转出$_COOKIE时,我只看到其中一个。

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

然后......

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

我的会话接口read($id)方法正在检查旧cookie,而不是我们在登录时设置的cookie。

解决此问题的最佳方法是什么?我想我可以更改会话名称/标识符并重新开始。或者可以在我的read实现中评估Apache标头。我没有找到太多与搜索网页相关的东西,只是来自w3schools的一堆绒毛污染了结果,所以我认为这可能是一个很好的发布在这里。

2 个答案:

答案 0 :(得分:1)

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

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

除非这些cookie包含非常有价值的数据,否则我不会关心旧的值,只是开始新的。

答案 1 :(得分:1)

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

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