页面刷新后会话消失

时间:2018-01-30 09:54:25

标签: php session

这是我第一次在PHP上使用会话。 从StackOverflow和其他网站获取一些信息,我正在构建我的第一个PHP登录但我遇到了问题而且不知道如何解决它。

基本上,在我设置会话时,页面刷新后,此会话消失。不应该留一段时间吗? (可以使用set_cookie_params等设置,但这是另一个主题)

我在页面的开头(全局)这段代码:

ini_set('session.cookie_httponly', 1);
ini_set('session.entropy_file', '/dev/urandom');
ini_set('session.hash_function', 'whirlpool');
ini_set('session.use_only_cookies', 1);
ini_set('session.cookie_secure', 1);

session_name("RANDOMID");
session_start();

if (isset($_SESSION['uid']))
{
    if ($_SESSION['ipremote'] !== getUserIP() && $_SESSION['useragent'] !== getUserAgent())
    {
        session_unset();
        session_destroy();

        session_regenerate_id(true);
    }
}
else
{
    session_regenerate_id(true);

    $_SESSION['ipremote'] = getUserIP();
    $_SESSION['useragent'] = getUserAgent();
}

然后在我的 login.php 文件中,当用户插入正确的信息时:

$_SESSION['uid'] = 3;

header("Location: index.php");
exit;

重定向uid会话消失之后的问题:我在 index.php 页面的末尾添加了var_dump变量的$_SESSION,我看到了只是每次在else条件中设置的IP和用户代理。

编辑:我尝试用session_start();替换会话初始化的所有内容并且它有效,我不明白为什么这个安全会话初始化它不起作用使会话消失。

6 个答案:

答案 0 :(得分:8)

当您测试时,是否通过https://呼叫您的网页?

否则,解释很简单:

ini_set('session.cookie_secure', 1);

这使得PHP使用secure标志设置会话cookie,这意味着浏览器只允许通过安全连接发回请求来发送此cookie。

因此,如果您实际上仅通过HTTP进行测试,那么会话cookie将不会与下一个请求一起发回,因此PHP找不到任何会话ID,因此当您调用session_start时会启动一个全新的会话。 ..

答案 1 :(得分:0)

当您根据生成方式刷新/更改页面时, RANDOMID 可能会发生变化!
因此,请确保在开始会话之前在所有页面中使用相同的' session_name' ,如下所示。

登录页面

session_name("SAME_NAME");
session_start();
$_SESSION['uid'] = 3;
header("Location: index.php");
exit;

索引页

session_name("SAME_NAME");
session_start();
var_dump($_SESSION['uid']);
exit;

答案 2 :(得分:0)

请尝试以下稍微修改过的代码段,以替换每页开头的global代码。

ini_set('session.cookie_httponly', 1);
ini_set('session.entropy_file', '/dev/urandom');
ini_set('session.hash_function', 'whirlpool');
ini_set('session.use_only_cookies', 1);
ini_set('session.cookie_secure', 1);

// start session
session_start();
// if session just started and uid is not set, add initial information such as user agent and ip address
if (!isset($_SESSION['uid']))
{
    $_SESSION['ipremote'] = getUserIP();
    $_SESSION['useragent'] = getUserAgent();
}
else
{
    // uid is set in session variables. User gets logged out in case of changed ip address and user agent.  
    if ($_SESSION['ipremote'] !== getUserIP() && $_SESSION['useragent'] !== getUserAgent())
    {
        session_unset();
        session_destroy();            
    }
    // if client information has not changed just regenerate the session
    session_regenerate_id(true);
}

答案 3 :(得分:0)

尝试检查 session.save_path

  1. phpinfo()
  2. 中找到session.save_path
  3. 检查是否存在。如果没有,请使用 mkdir
  4. 检查其许可。将其更改为其他人可以读/写( chmod 707
  5. 当我在我的开发服务器(AWS EC2 Linux AMI)上通过yum安装新的php扩展(SOAPClient)时,有经验的会话在刷新或页面移动时会消失。

    原因是我的会话目录的权限已更改为500,即使我没有做任何事情。所以php无法将会话文件写入磁盘。

    希望这可以帮助你:)

答案 4 :(得分:0)

这是因为session_start()必须是代码的第一行。

您也可以在我的旧答案中看到this

祝你好运。

答案 5 :(得分:0)

请在每个页面的顶部使用session_start(),需要访问页面上的会话数据。