2014-02-05 52 views
1

我试图让我的头围绕PHP会话。session_regenerate_id()后删除的会话变量

我使用ShortPHP作为路由器,但ShortPHP代码不会触及会话。

模板具有session_start()作为第一行: -

<?php 
session_start(); 
include 's.php'; 
var_dump($_SESSION); 
$sid = session_id(); 
echo $sid; 
?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head> 

此模板首先被执行的每一页(我已经添加了前几行(的var_dump等),以调试),其次是具体的页面代码。在这种情况下,我使用下面的代码: -

<?php 
if (!defined('S')) die ("You've got no S"); // part of ShortPHP - irrelevant 

if (!isset($_SESSION['login']) || $_SESSION['login'] != "1") { 
     echo "<p>Session is NOT set</p>"; 
     //header() redirect to login here... 
     //exit(); 
} 

$sri = session_regenerate_id(); 
var_dump($sri); 

?> 

如果我注释掉session_regenerate_id()那么会话变量(login)仍然是重新加载页面后可用,但启用session_regenerate_id(),会话变量被删除当我重新加载页面。请注意0​​每次返回true

我甚至已经读取存储在服务器上的会话,原始会话的文件中包含会话变量数据,而在页面重新加载后,新会话文件没有变量(文件大小为零)。

我在这里做错了什么?

+0

在重设ID和'session_regenerate_id()'返回之前,您是否有任何输出到浏览器? – jeroen

+0

用您的问题的答案编辑问题:是和真 – garethTheRed

+0

奇怪。如果您在发送标头之前使用'session_regenerate_id()'(输出发送到浏览器),它会有所帮助吗? – jeroen

回答

2

当https未使用时,原因是session.cookie_securephp.ini中设置。一旦我删除了该设置,会话在页面刷新之间持续。

0

通常最好将true作为参数传递给session_regenerate_id();,因为这样会删除旧的会话数据。

+0

整个想法是为了避免删除旧的会话数据 - 我希望它会传递给新的会话ID。 – garethTheRed

+0

应该是,通过真删除导致构成安全问题的旧会话。以前的数据应该与新的会话ID一起提供。 – AJC