为什么$ _SESSION已清空?

时间:2013-01-26 16:31:30

标签: session session-variables php sessionid

根据Allow php sessions to carry over to subdomains,有3种方法允许跨不同子域的PHP会话。

  • php.ini:session.cookie_domain = ".example.com"
  • .htaccess:php_value session.cookie_domain .example.com
  • php脚本:ini_set('session.cookie_domain', '.example.com' );

(我的网络主机不允许通过.htaccess修改PHP,所以我尝试了其他两种方法。)

然而,我的login.php中的session_regenerate_id(true);session.cookie_domain = ".example.com"冲突,因为在重定向标头之后,它会清空PHP会话变量。

的login.php

if (!isset($_SESSION)) { session_start(); }

// authentication codes...

session_regenerate_id(true);
$_SESSION['username'] = $username;
header('Location: redirect.php');
exit;

redirect.php

if (!isset($_SESSION)) { session_start(); }
var_dump($_SESSION); // returns array(0) { } if session.cookie_domain is set

我了解在true中使用session_regenerate_id()会删除旧会话,但如果未设置session.cookie_domain,则不会清空会话变量。为什么会这样?

如果我不重新生成会话ID,则上述3个解决方案不起作用,但这样做会导致会话变量被清空。知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

<?php
session_start();
session_regenerate_id();
setcookie('session_id', session_id(), 0, '/', '.yourdomain.com');
if( !empty($_SESSION["user_logged_in"]) ){
header("Location: home.php");
} else {
header("Location: index.php");
}

显然setcookie不太安全,但是如果这3个都不适合你,那么你可以使用原始域的额外会话,如果你想要额外的安全性,你可以将它们存储在数据库中使用setcookie选项