代码之家  ›  专栏  ›  技术社区  ›  rg88

会话变量未设置,但仅在Internet Explorer中设置,而不是在所有计算机上设置。

  •  5
  • rg88  · 技术社区  · 14 年前

    登录到一个我正在本地计算机上按预期运行功能的站点,但在远程服务器上失败,但仅在Internet Explorer中失败。更糟糕的是,它在IE本地工作,而不是在远程机器上。

    世界上什么会导致这种情况?我已经完成了远程机器上的代码,可以看到输入的登录值正在数据库中被检查,它们被找到,然后调用一个登录函数。这将设置两个$_会话变量并重定向到主管理页。但是,仅在IE中(而不是在本地计算机上运行时…这是关键)当您到达主管理页面时,$会话变量不存在。 var_dump($_SESSION) 当我在本地环境中运行时,以及在远程服务器上运行时(在远程服务器上运行时,我会得到一个空值,就好像没有为$_会话设置任何值一样),在每个浏览器上都会得到我所期望的结果。

    这真的让我难堪,所以任何建议都会受到赞赏。

    举个例子…在IE中,本地运行,var_dump给出:

    array
    'Username' => string 'theusername' length=11
    'UserID'   => string 'somevalue' length=9
    

    在远程服务器上运行(即仅…在其他浏览器中工作正常)var_dump给出:

    array(0){}
    

    代码(最简单的例子…尽管这个问题不需要代码示例):

    $User = GetUser($Username, $Password);
        if ($User->UserID <> "") { // this works so we call Login()...
            Login($User); // this also works and gives expected results. on to redirect...
            header("Location: index.php"); // a var_dump at index.php shows that there is no session data at all in IE, remotely.
        } else {
            header("Location: login.php");
        }
    
    
    function Login($data) {
            $_SESSION['Username'] = $data->Username;
            $_SESSION['UserID'] = $data->UserID;
    // a var dump here gives the expected data in every browser
        }
    

    编辑: 解决了这个问题。事实上,测试服务器上的域名中有一个下划线。不知道为什么,现在也没有时间去谷歌搜索,但问题出在下面的下划线上,它的名字类似于某个“客户”ourcompany.com。一定喜欢Internet Explorer…这就像一个被动的、好斗的同事,你根本无法避免。

    5 回复  |  直到 8 年前
        1
  •  2
  •   rg88    13 年前

    把它作为一个答案放进去(用户tuzo建议),以便更容易找到。解决了这个问题。事实上,测试服务器上的域名中有一个下划线。不知道为什么,也不知道现在有时间去谷歌搜索,但是下面的下划线是问题所在,它的名字类似于某个“客户”ourcompany.com。一定喜欢Internet Explorer…这就像一个被动的、好斗的同事,你根本无法避免。

    从另一个这样的答案…准确解释发生了什么: 其中一个子域是否使用下划线?IE在接受子域的cookie时遇到问题,这些cookie不遵循URI RFC。(http://www.ietf.org/rfc/rfc2396.txt)

        2
  •  1
  •   joealba    14 年前

    检查php.ini文件中session.cookie_域的值。如果设置了该值,请确保它是您所期望的。这是我能想到的最大的事情,它可以在本地和远程表现不同。

    此外,如果将值设置为session.cookie_lifetime,请尝试在php.ini中注释该行。我在那里看到了一些特殊的行为.

    这是一个快速会话检查器。如果重新加载页面并不断看到令牌的新值,则不会得到持久会话。然后您可以肯定地归咎于服务器/php配置,而不是您的代码。

    <?php
    session_start();
    if (!isset($_SESSION['token'])) {
        $_SESSION['token'] = sha1(uniqid(rand(), true));
    }
    
    if (!empty($_POST)) {
      $_SESSION['hi'] = preg_replace('/[^\w ]+/','',$_POST['hi']);
      header("Location: index.php");
      exit;
    }
    
    ?>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <title>Session test</title>
    </head>
    <body>
    
    <h1>How's that session doing?</h1>
    <p>Message: <?=htmlspecialchars($_SESSION['hi'])?></p>
    <p>Token: <?=htmlspecialchars($_SESSION['token'])?></p>
    
    
    <form action="index.php" method="post">
    <fieldset>
      <label for="hi">What do you have to say?</label>
      <input type="text" name="hi" id="hi">
      <input type="submit" value="Submit">
    </fieldset>
    </form>
    
    </body>
    </html>
    
        3
  •  1
  •   kds    13 年前

    “测试服务器上的域名中有下划线” 这是绝对正确的。这篇文章是在花了3个多小时来解决同一个问题后发现的。多谢高山88

        4
  •  0
  •   bmeulmeester    14 年前

    尝试将session_start();放在正在进行会话的页面顶部。 并检查是否以正确的方式分配会话变量:

    $_SESSION['SESSION_NAME'] = 'sessionValue';
    
        5
  •  0
  •   flyingwithphalcon    9 年前

    我们也遇到过同样的问题,但是服务器名称字符和服务器时间不符。这导致我们的会话cookie在IE中立即失效,而它在其他浏览器上工作。