Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache 相同IP地址但不同端口上的相同会话ID_Apache_Session_Port - Fatal编程技术网

Apache 相同IP地址但不同端口上的相同会话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? 不同的端口不会有不同的会

我在两台不同的计算机上运行我的网站(完全相同的源代码,甚至用户登录详细信息),每台计算机都有自己的apache。 用户可以通过我的端口fwd设置访问这两个网站

例如,10.10.10.10:81访问计算机A上的网站,10.10.10.10:82访问计算机B上的网站

用户访问其中任何一个都没有问题。直到用户想同时使用同一个internet浏览器访问这两个站点

登录计算机B上的网站将使他/她从计算机A上的网站注销

为什么会这样? 因为相同的IP地址将自动生成相同的会话ID? 不同的端口不会有不同的会话ID? 如何避免这种情况?手动生成会话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"
      }