页面刷新后会话消失

8
这是我第一次在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页面的末尾放置了$_SESSION变量的var_dump,并且我只看到每次在else条件中设置的IP地址和用户代理。 编辑:我尝试只用session_start();替换会话初始化的所有内容,它可以正常工作,但我不明白为什么这个安全的会话初始化不能正常工作并导致会话消失。

4
index.php 文件中,顶部需要添加 session_start(); 语句,以便于访问 SESSION 变量和值。请注意,翻译过程中不会添加解释或其他任何额外的信息。 - Alive to die - Anant
已经设置好了,因为代码的第一部分是全局的(在login.php和index.php两个文件中都需要),位于开头。 - Keaire
session_name("RANDOMID") - 这里的“RANDOMID”是字面意思吗?还是表示每次都会随机生成一个新的ID呢? - deceze
这只是一个随机名称,因此它就是RANDOMID(没有定义或变量)。 - Keaire
1
当您刚刚销毁了会话时,可以使用session_regenerate_id(true) - user2560539
如果您仍然有问题,请尝试在login.php文件顶部添加session_start(); - Praneeth Nidarshan
6个回答

9
你是否在测试时通过 https:// 访问你的页面?如果不是,那么问题很简单:
ini_set('session.cookie_secure', 1);

这将使PHP使用“secure”标志设置会话cookie,这意味着浏览器只能在安全连接上发送此cookie以及后续请求。因此,如果您实际上只通过HTTP进行测试,则会话cookie将不会随下一次请求发送回来,所以当您调用session_start时,PHP找不到任何会话ID,因此开始一个新的会话...

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;

你的回答是基于名称是随机生成的假设,但OP在他的帖子评论中解释说他实际上并没有随机生成会话名称。 - halfpastfour.am

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);
}

0

尝试检查session.save_path

  1. phpinfo()中找到session.save_path
  2. 检查它是否存在。如果不存在,使用mkdir创建。
  3. 检查其权限。将其更改为其他人可以读/写(chmod 707)

当我通过yum在我的开发服务器(AWS EC2 Linux AMI)上安装新的php扩展(SOAPClient)时,遇到了像您一样刷新或移动页面时会话消失的问题。

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

希望这可以帮助您 :)


0
这是因为session_start()必须是你的代码的第一行。
你也可以在我的旧回答中看到this
祝好运。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接