浏览器发送两个 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 还活着。
一段时间以来,在单个站点上设置了 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 还活着。