Apache 相同IP地址但不同端口上的相同会话ID
我在两台不同的计算机上运行我的网站(完全相同的源代码,甚至用户登录详细信息),每台计算机都有自己的apache。 用户可以通过我的端口fwd设置访问这两个网站 例如,10.10.10.10:81访问计算机A上的网站,10.10.10.10:82访问计算机B上的网站 用户访问其中任何一个都没有问题。直到用户想同时使用同一个internet浏览器访问这两个站点 登录计算机B上的网站将使他/她从计算机A上的网站注销 为什么会这样? 因为相同的IP地址将自动生成相同的会话ID? 不同的端口不会有不同的会话ID? 如何避免这种情况?手动生成会话ID可以吗?这个问题还有其他解决方案吗Apache 相同IP地址但不同端口上的相同会话ID,apache,session,port,Apache,Session,Port,我在两台不同的计算机上运行我的网站(完全相同的源代码,甚至用户登录详细信息),每台计算机都有自己的apache。 用户可以通过我的端口fwd设置访问这两个网站 例如,10.10.10.10:81访问计算机A上的网站,10.10.10.10:82访问计算机B上的网站 用户访问其中任何一个都没有问题。直到用户想同时使用同一个internet浏览器访问这两个站点 登录计算机B上的网站将使他/她从计算机A上的网站注销 为什么会这样? 因为相同的IP地址将自动生成相同的会话ID? 不同的端口不会有不同的会
谢谢。您没有提供太多信息,但是如果会话使用cookie进行维护,并且使用相同的域名访问两个站点,那么cookie将应用于对两个站点的请求 当用户从站点A切换到站点B(使用相同的浏览器实例)时,将发送会话cookie,但与现有会话ID不匹配-因此站点B将生成新会话ID并将其设置为“会话cookie”
解决此问题的两种通用方法-要么为两个站点使用两个不同的域名,要么以其他方式区分会话cookie。您可以通过为站点a和站点B中的会话Cookie配置不同的名称来实现这一点。具体操作取决于创建站点a和站点B所使用的技术—您没有告诉我们。Cookie不是特定于端口的 这意味着,如果运行在10.10.10.10:81上的服务器设置了cookie sessionId=123455,则相同的cookie将被发送到运行在10.10.10.10:80上的服务器。这将导致您描述的场景
- 用户进入服务器10.10.10.10:81
- 10.10.10.10:81服务器为该用户建立会话并设置cookie
- 用户登录到服务器,现在可以使用会话进行浏览
- 然后用户转到10.10.10.10:80,浏览器发送由10.10.10.10:81设置的会话cookie
- 因为10.10.10.10:80对10.10.10.10:81上的会话一无所知,它会建立一个新会话并设置新会话cookie覆盖旧会话
- 新会话cookie仅在10.10.10.10:80时有效,因此用户在10.10.10.10:81时注销
- (首选)为会话cookie配置不同的名称 或
- 将服务器配置为在设置会话cookie标头时传递端口参数。这将使cookie特定于域+端口组合。如果可能,请避免使用此解决方案,因为并非所有浏览器都正确处理此参数
- 这是解决这个问题的例子:
127.0.0.1:110
session_start();
$_SESSION['ss'] = 'll';
echo '<pre>';
var_dump( $_SESSION);
ouput:
array(1) {
["ss"]=>
string(2) "ll"
}
127.0.0.1:111
session_start();
echo '<pre>';
var_dump( $_SESSION);
ouput:
array(1) {
["ss"]=>
string(2) "ll"
}
127.0.0.1:110
会话_start();
$_会话['ss']='ll';
回声';
变量转储($\会话);
输出:
阵列(1){
[“ss”]=>
字符串(2)“ll”
}
127.0.0.1:111
会话_start();
回声';
变量转储($\会话);
输出:
阵列(1){
[“ss”]=>
字符串(2)“ll”
}
更改会话路径后
127.0.0.1:110
会话保存路径('/tmp/sess')//必须在会话_start()之前写入此行,
会话_start();
$_会话['ss']='ll';
回声';
变量转储($\会话);
输出:
阵列(1){
[“ss”]=>
字符串(2)“ll”
}
127.0.0.1:111
会话_start();
回声';
变量转储($\会话);
输出:
数组(0){
}
127.0.0.1:111
会话保存路径('/tmp/sess');
会话_start();
$_会话['ss']='ll';
回声';
变量转储($\会话);
输出:
阵列(1){
[“ss”]=>
字符串(2)“ll”
}
您还需要其他信息吗?我使用的是Yii(php),我没有手动设置任何会话或cookie。我使用的是IP地址而不是域名。我认为使用不同的IP/域可以避免这种情况,但我只得到一个IP地址。谢谢。@AlyshaSantana-我自己没有使用Yii,但看起来很可能适合您需要设置的内容。对不起,我不是Alysha Santana,我不知道为什么我在注册时将此作为我的显示名。你是说我必须手动设置会话?除了手动设置会话,还有其他解决方案吗?谢谢你。@Wooi-就像我说的,我自己没有用Yii,所以我不会假装是专家。我在Yii session cookie name
上搜索到了上面的链接-在其他链接之后,你可能会有更好的运气和更多的知识。我认为与Yii无关,因为我的其他使用java的网站也会有类似的问题。
127.0.0.1:110
session_save_path('/tmp/sess');//This line must be wrote before session_start(),
session_start();
$_SESSION['ss'] = 'll';
echo '<pre>';
var_dump( $_SESSION);
ouput:
array(1) {
["ss"]=>
string(2) "ll"
}
127.0.0.1:111
session_start();
echo '<pre>';
var_dump( $_SESSION);
ouput:
array(0) {
}
127.0.0.1:111
session_save_path('/tmp/sess');
session_start();
$_SESSION['ss'] = 'll';
echo '<pre>';
var_dump( $_SESSION);
ouput:
array(1) {
["ss"]=>
string(2) "ll"
}