1

我尝试通过以下方式在本地主机上为其中一个网站进行编码。说本地主机/ abc:

<?php
session_start();
$_SESSION['name']=$row['name']
?>

输出很好。但是当相同的代码用于同一本地主机上的另一个网页时,请说 localhost/xyz。然后名字之间就出现了歧义。好像我需要区分 xyz 和 abc 的会话。

所以我尝试了这个:

<?php
session_id(226);
session_name(veer);
session_start();
.
.
.//connection with database and all
.
$_SESSION['name']=$row['name'];
echo($_SESSION['name']);
?>

当另一台机器通过同一服务器登录时,该机器可以访问我创建的会话以访问同一网页。

有什么解决办法。或者如何区分两个会话。?

4

4 回答 4

3

简而言之……当您使用同一浏览器实例访问同一 Web 服务器上的两个不同站点时,您访问的是服务器的同一内存区域。因此

http://localhost/xyz并且http://localhost/abc指的是同一个站点 localhost,因此您不会启动另一个会话,session_start()而是恢复它。您也可以像Jon所说的那样创建虚拟主机,但为了测试,我猜您是这样,只需使用不同的浏览器。

此外,您不能正常在不同的机器上共享会话,所以我认为这是您的逻辑错误。或者尝试

session_start();
echo (session_id());

在页面顶部,查看您是否正在开始或恢复我认为您没有的同一会话。我认为您的页面在不同的会话中存储了相同的数据,您被误认为是同一会话。

于 2012-05-24T10:45:24.173 回答
1

session_regenerate_id();在第二个文件(xyz)中使用方法。

于 2012-08-10T14:08:46.053 回答
0

这个?

<?php
session_start();
if (!isset($_SESSION['xyz'])) { $_SESSION['xyz'] = array(); }
$_SESSION['xyz']['name'] = $row['name'];
?>

有时,我只是在会话密钥示例前面加上前缀,而不是执行上述操作: $_SESSION['xyz_name']; 在我意识到我的 CPanel 已经使用了一些自己的会话导致我的冲突之后,我这样做了。

于 2012-05-24T10:15:49.750 回答
0

从同一个用户代理到同一个 Web 服务器的请求将共享同一个会话,除非显式配置取决于您的确切服务器设置。

通常会避免这个问题,因为“其他网页”实际上会完全位于另一个域上,因此不会共享会话 cookie(以及扩展会话数据)。如果您想独立运行单独的应用程序,这也是您应该做的localhost:在单独的内部域上设置单独的虚拟主机。

您也可以纯粹在代码中解决问题,方法是不$_SESSION直接使用存储数据,而是使用基于某些差异因素的子键,例如$_SESSION['SCRIPT_NAME']. 一个非常简单的例子:

$sessionKey = "default";
if (strpos($_SESSION['SCRIPT_NAME'], "dir1/")) {
    $sessionKey = "dir1";
}
else if (strpos($_SESSION['SCRIPT_NAME'], "dir2/")) {
    $sessionKey = "dir2";
}

$_SESSION[$sessionKey]['mydata'] = 'foo';

然而,最后一个是一个非常不雅的解决方案,我不推荐。

于 2012-05-24T10:20:30.783 回答