会话变量在IE和Safari中工作,但不是Chrome,Opera或Firefox?

时间:2012-09-04 15:27:50

标签: php

我正在从登录页面设置会话变量($ _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
    }

}

?>

page(inside_page.php):

<?php

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

session_start();

$login = new Check_login;

?>

再一次,任何帮助都会非常棒。谢谢!

4 个答案:

答案 0 :(得分:3)

我想出了这个 - 我不能说我理解为什么会这样,但这就解决了我的问题。在我的登录页面中,在验证登录凭据后,我将会话变量“login”设置为1,然后显式重定向到另一个页面。我在测试后意识到,使用相对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
}

?>

我仔细检查了,安全连接肯定不是问题,它是显式网址。

使用相对位置,我的会话变量出现在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' ;
}

?>

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

答案 1 :(得分:0)

session_start()移到inside_page.php。

中的require语句之上

会话应该在脚本的最开头启动,几乎总是在包含之前启动。

答案 2 :(得分:0)

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

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

对于通过Google遇到此问题的人,如果您使用DAP进行此操作,请在/dap/authenticate.php中进行这些更改

答案 3 :(得分: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