PHP - 会话Cookie在预期之前过期/失效

时间:2017-09-01 17:45:46

标签: php .htaccess session cookies

我使用以下脚本登录

session_start();
$_SESSION['username'] = $query[0]['username'];
$_SESSION['email'] = $_POST['email'];
$_SESSION['image'] = $query[0]['image'];
$_SESSION['role'] = $query[0]['role'];
$_SESSION['banned'] = $query[0]['banned'];
$_SESSION['id'] = $query[0]['id'];
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
$_SESSION['useragent'] = $_SERVER['HTTP_USER_AGENT'];
setcookie(session_name(),session_id(),time()+604800,"/");
//redirect to homepage since now logged in.

现在我再次登录主页并登录,一切正常。 但是在几个小时后,isset($ _ SESSION ['用户名'])将返回false,但到期时间仍设置为7天,并且cookie仍然存在。

有效期的小时比我的时区的实际时间小1小时。不确定这是否重要。我将时区服务器端更改为随机时区,并且cookie过期数据没有更改。

htaccess的:

php_value session.cookie_lifetime 604800
php_value session.gc_maxlifetime 604800

(这个htaccess在root中,上面的第一个代码块是root / login。不确定是否重要。)

2 个答案:

答案 0 :(得分:0)

session_start();session_regenerate_id();移到脚本底部。

<?php
$_SESSION['username'] = $query[0]['username'];
$_SESSION['email'] = $_POST['email'];
$_SESSION['image'] = $query[0]['image'];
$_SESSION['role'] = $query[0]['role'];
$_SESSION['banned'] = $query[0]['banned'];
$_SESSION['id'] = $query[0]['id'];
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
$_SESSION['useragent'] = $_SERVER['HTTP_USER_AGENT'];
setcookie(session_name(),session_id(),time()+604800,"/");
session_start();
session_regenerate_id();
?>

这种逻辑背后的原因是您正在设置cookie,一旦设置好并准备就绪,那么您就开始了会话。有一个答案here可以更好地解释它:

  1. Cookie数据在页面标题中发送。

  2. 将标头发送到客户端后,您无法设置Cookie。

  3. 一旦您开始向客户端输出任何数据(即:浏览器),就会发送标题。

答案 1 :(得分:0)

尝试使用内置session_set_cookie_params可能是最糟糕的,而不是通过黑客来更改Cookie的到期日期...另请注意session_regenerate_id可能导致{{3} }}