根据Allow php sessions to carry over to subdomains,有3种方法允许跨不同子域的PHP会话。
session.cookie_domain = ".example.com"
php_value session.cookie_domain .example.com
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个解决方案不起作用,但这样做会导致会话变量被清空。知道如何解决这个问题吗?
答案 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选项