这是我第一次在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
- 从phpinfo()查找session.save_path
- 检查它是否存在。如果不存在,请使用MKDIR进行。
- 检查其权限。 将其更改为其他人可以读/写(CHMOD 707)
当我在我的开发服务器(AWS EC2 Linux AMI)上通过yum安装新的php扩展(SOAPClient)时,当刷新或页面像您一样移动时,体验到会话消失。
原因是我的会话目录的权限更改为 500,即使我什么都没做。 所以PHP无法将会话文件写入磁盘。
希望这可以帮助您:)
发生这种情况是因为session_start()
必须是代码的第一行。
你也可以在我的一个旧答案中看到这一点。
祝你好运。
请在每个页面顶部使用 session_start(),需要访问页面上的会话数据。