页面刷新后会话消失



这是我第一次在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();
}

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

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

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

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

当您测试此内容时,您是否通过https://调用您的页面......?

否则,解释很简单:

ini_set('session.cookie_secure', 1);

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

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

当您刷新/更改页面时,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;

请尝试以下稍作改动的片段,以替换每个页面开头的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);
}

尝试检查session.save_path

  1. phpinfo()查找session.save_path
  2. 检查它是否存在。如果不存在,请使用MKDIR进行。
  3. 检查其权限。 将其更改为其他人可以读/写(CHMOD 707)

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

原因是我的会话目录的权限更改为 500,即使我什么都没做。 所以PHP无法将会话文件写入磁盘。

希望这可以帮助您:)

发生这种情况是因为session_start()必须是代码的第一行。

你也可以在我的一个旧答案中看到这一点。

祝你好运。

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

最新更新