PHP会话信息未被存储

时间:2015-06-17 01:55:42

标签: php session

我正在尝试创建一个非常简单的网站,您可以转到主页并登录,其代码在此处 example.org/login/index.php:

<?php
    session_start();
    $warning = $_GET['warning'];
    $nolog = $_GET['nolog'];
    $username = "Welcome, please log in";
    if ($warning) {
        $username = "Wrong Username/Password Combination";
    }
    if ($nolog) {
        $username = "Page inaccessible: Login required";
    }
    if ($logout) {
        $username = "Thank you for your session";
    }
?>
<!DOCTYPE html>
<body>
    <div class="center">
        <span class="warning"><?= $username ?></span>
        <form action="submit.php" method="post">
            <span class="formField">Username:</span><br>
            <input type="text" name="user" class="field">
            <br>
            <span class="formField">Password:</span><br>
            <input type="password" name="password" class="field">
            <br>
            <br>
            <input type="submit" name="submit" value="Submit" class="field">
        </form>
    </div>
</body>
</html>

提交页面看起来像这样(当我开始工作时,我不会像这样硬编码用户名和密码,现在只是为了简明扼要) example.org /login/submit.php

<?php
    session_start();
    $username = $_POST['user'];
    $password = $_POST['password'];

    if ($username == "admin" && $password == "12345") {
        $_SESSION['loggedin'] = TRUE;
        header("Location: http://www.example.org/welcome/");
        die();
    }
    else {
        $_SESSION['loggedin'] = FALSE;
        header("Location: http://www.example.org/login/index.php?warning=true");
        die();
    }
?>

欢迎页面如下所示 example.org/welcome/index.php

<?php
    session_start();
    if(!isset($_SESSION["loggedin"]) || $_SESSION["loggedin"] == FALSE){
        unset($_SESSION);
        session_destroy();
        header("Location: http://www.example.org/login/index.php?nolog=true");
    }
?>
<!DOCTYPE html>
<body>
    Hi
</body>
</html>

我知道这是很多代码,但是当我尝试运行它时第一次在欢迎页面周围返回一个错误,说它无法访问,并将我发送回登录页面,但第二次看起来似乎工作正常并让我登录。有人能理解为什么会这样吗?

修改

在详细了解之后,我发现问题仅存在于Google Chrome和Firefox中,但在其他浏览器(如Internet Explorer或Apple Safari)中不存在。现在进入浏览器的渲染引擎。有没有人知道我可以使用会话ID的另一种方式可能绕过所有浏览器的整个问题,或许是另一种验证用户的方式?

2 个答案:

答案 0 :(得分:0)

尝试使用以下

define('BASE_URL', 'http://www.example.org/');

if ($username == "admin" && $password == "12345") {
   $_SESSION['loggedin'] = TRUE;
   header("Location:".BASE_URL."welcome.php");
   exit();
} else {
   header("Location:".BASE_URL."index.php");
   exit();
}

在欢迎页面的开头添加以下内容

session_start();    
if(!isset($_SESSION['loggedin'])){
   header("Location:".BASE_URL."index.php");
   exit();
}

答案 1 :(得分:0)

如果你注意我提到的文件的名称,我说我正在将我的浏览器导向example.org/login/submit.php,然后将其转发到www.example.org/welcome/index .PHP。

在Google Chrome和Mozilla Firefox中,他们关心的是在网站之前使用www之间的区别,而在Internet Explorer和Safari中他们并不关心差异。在我的服务器上,网站www.example.org和example.org是彼此的镜像(这是一个单独的安全问题),因此谷歌Chrome和Mozilla Firefox将以不同的方式对待它们,并为它们提供不同的$ _SERVER全局变量,而Internet Explorer和Safari不关心这种差异。