1

我正在从登录页面 ($_SESSION['login']) 设置会话变量。我已经彻底测试过,肯定会创建变量并存储正确的值($_SESSION['login'] = '1'),但使用 Chrome、Opera 或 Firefox 在下一页中无法识别该变量- 奇怪的是,在 Safari 和 Internet Explorer 中,相同的脚本可以正常工作。

任何帮助都将不胜感激-我一直在尝试解决这个问题,但无法得到它-我在这里完全不知所措。

这是一步一步-

<?php
// log in page
// if logged in successfully set the session variable

session_start();

if (// log in credentials good) {
    $_SESSION['login'] = '1';
    header('location:inside_page.php');

    // echo $_SESSION['login'] ;
    // ----------------------
    // commenting out the redirect and echoing
    // the session variable works as expected
    // in IE, Safari, Chrome, Opera and Firefox
}

?>

这是我的 Check_login 类 - 它在下一页(inside_page.php)中被实例化 -

班级:

<?php

if (! defined('EXT')){ exit('Invalid file request'); }

class Check_login { 
    private $login = null ;

    function __construct() {
        session_start();
        $this->login = $_SESSION['login'];
        if ($this->login != '1') {
            header('location:../index.php');
        }

        // $login = $this->login ;
        // echo $login ;
        // $session = $_SESSION['login'];
        // echo $session ;
        // ----------------------
        // commenting out the redirect and echoing the
        // session variable shows 1 in IE and Safari, but
        // empty in Chrome, Opera and Firefox
    }

}

?>

页面(inside_page.php):

<?php

require('../lib/Check_login.php');

session_start();

$login = new Check_login;

?>

同样,任何帮助都会非常棒。谢谢!

4

4 回答 4

3

我想通了 - 我不能说我明白为什么会这样,但这就是解决我的问题的原因。在我的登录页面中,验证登录凭据后,我将会话变量“登录”设置为 1,然后显式重定向到另一个页面。我在测试后意识到,使用相对 URL 进行重定向可以解决问题。

我的原始帖子甚至没有说明 URL,因为我认为没有必要,但这就是问题所在 -

<?php
// log in page
// if logged in successfully set the session variable

session_start();

if (// log in credentials good) {
    $_SESSION['login'] = '1';
    header('location:https://www.somedomain.com/inside_page.php'); // *** PROBLEM
}

?>

通过相对设置位置,我的问题就消失了-

<?php
// log in page
// if logged in successfully set the session variable

session_start();

if (// log in credentials good) {
    $_SESSION['login'] = '1';
    header('location:inside_page.php'); // *** FIX
}

?>

我仔细检查了,安全连接绝对不是问题,它是显式 URL。

使用相对位置,我的会话变量显示在 Internet Explorer、Safari、Chrome、Opera 和 Firefox 的下一页中。使用一个明确的位置,它出现在 IE 和 Safari 中,但不在 CHROME、OPERA 和 FIREFOX 中。

您可以轻松地重新创建并亲自尝试 -

<?php

// ------- page_one.php -------

session_start();

$_SESSION['val'] = '1';

header("location:http://www.somedomain.com/page_two.php") ;
// header("location:page_two.php") ;

?>

<?php

// ------- page_two.php -------

session_start();

if ($_SESSION['login'] != '1') {
    echo 'false' ;
} else {
    echo 'true' ;
}

?>

希望这可以节省其他人一些时间(和头痛)。

于 2012-09-05T12:09:29.347 回答
0

移到inside_page.phpsession_start()中的 require 语句上方。

会话应该在脚本的最开始就开始,并且几乎总是在包含之前。

于 2012-09-04T15:31:48.703 回答
0

我在尝试将 digitalaccesspass (DAP) 集成到 PHP5.5 服务器时遇到了类似的问题(破坏了所有 Webkit/Blink 浏览器,因此破坏了 Chrome、Safari 和 Opera 的登录),并且这些更改的星座有所帮助。

  • 我确保验证器中的第一行是session_start()
  • 就在我添加的所有重定向(header("Location:")调用)之前session_write_close()
  • 重定向被编辑为相对路径,而不是绝对路径。

对于通过 Google 偶然发现此问题的人,如果您使用 DAP 解决此问题,请在 /dap/authenticate.php 中进行这些更改

于 2013-10-11T01:00:04.080 回答
0

我的 PHP 会话也无法在 Chrome 中运行。

我发现 PHPSESSID cookie 路径在我的页面之间没有同步,尽管每个页面都只是session_start()用来初始化每个会话。

将上面的这一行添加session_start()到我将数据写入会话的页面解决了这个问题:

session_set_cookie_params(600, '/');

看:

http://php.net/manual/en/function.session-set-cookie-params.php

于 2017-03-02T05:49:24.267 回答