如果两个网站使用相同的会话变量(它们共享我编写的相同代码)并且我在同一个浏览器中打开它们(在两个选项卡中),则 SiteA 的会话与 SiteB 的值混淆,反之亦然。例如,如果我$_SESSION['var1']=1
在 SiteA 中设置,然后在同一浏览器中打开 SiteB 并执行array_dump($_SESSION)
然后我var1
在转储中看到。
我该怎么做才能让一组会话变量保持在一个站点的“范围”内?
如果两个网站使用相同的会话变量(它们共享我编写的相同代码)并且我在同一个浏览器中打开它们(在两个选项卡中),则 SiteA 的会话与 SiteB 的值混淆,反之亦然。例如,如果我$_SESSION['var1']=1
在 SiteA 中设置,然后在同一浏览器中打开 SiteB 并执行array_dump($_SESSION)
然后我var1
在转储中看到。
我该怎么做才能让一组会话变量保持在一个站点的“范围”内?
我想这些会话在同一个域下,并且都使用相同的会话 cookie 名称。session_name
使用(在您运行之前)更改此会话的名称session_start
。
也许为您的会话变量添加一些前缀以区分另一个?
例如
siteA_loggedIn
siteB_loggedIn
如果您在同一个域名上运行两个单独的站点,则默认情况下它们确实会共享会话数据,但您可以更改它。会话 cookie 的名称设置php.ini
为session.name
指令(默认情况下,它是PHPSESSID
),但您可以用session_name()
.
您要做的是改为在一个站点上调用会话 cookie SessionSiteA
(注意,会话名称必须是字母数字,并且必须至少包含一个字母)。
因此,您的选择是 (a)php.ini
每个站点都有不同的文件;(b) 覆盖其中的值.htaccess
(这对于某些但不是全部php.ini
设置是允许的,我目前无法弄清楚如何做到这一点session.name
:这可能是不可能的);或 (c)session_name()
在设置或读取任何会话之前调用其中一个站点中的函数。请注意,它的计算成本session_name()
可能很高,因此请谨慎使用(可能仅在其中一个站点上,让繁忙的站点使用默认值)。PHPSESSID
注意:另一个选项可能是将每个站点的会话保存在不同的位置,ini_set('session.save_path', ...)
在每个站点上使用不同的方式。如上所述,这必须在设置或使用任何会话之前集中完成。