在php中跨子域(www)共享/删除cookie

时间:2012-03-12 19:42:59

标签: php cookies save subdomain

我有一个登录/注销系统,需要cookie才能在www.mydomain.com以及mydomain.com上运行。我遇到的问题是删除cookie。在登录时,我正在设置这样的cookie:

session_start();
//set session vars
setcookie('user_id', $row['user_id'], time() + (60 * 60 * 24 * 30), '/', 'domain.com');
setcookie('full_name', $row['first_name']." ".$row['last_name'], time() + (60 * 60 * 24 * 30), '/', 'domain.com');

哪个有效,并且cookie已保存,无论是否使用www都可以使用。它允许查看具有以下代码的个人资料页面:

session_start();
if(!isset($_SESSION['user_id'])) {
if(isset($_COOKIE['user_id']) && isset($_COOKIE['full_name'])) {
    $_SESSION['user_id'] = $_COOKIE['user_id'];
    $_SESSION['full_name'] = $_COOKIE['full_name'];
}
}
if(!isset($_SESSION['user_id'])) {
echo '<p class="login">Please <a href="login.php">log in</a> to access this page.</p>';
exit();
}

问题是退出:

session_start();

if(isset($_SESSION['user_id'])) {
$_SESSION = array();

if (isset($_COOKIE[session_name()])) {
    setcookie(session_name(), '', time() - 3600, '/', 'domain.com');
}

session_destroy();
}
setcookie('user_id', '', time() - 3600, '/', 'domain.com');
setcookie('full_name', '', time() - 3600, '/', 'domain.com');

Cookie已删除,但仅限当前域。因此,如果我从domain.com/login.php登录并从domain.com/logout.php注销,则domain.com/profile.php无效(好)但我仍然可以查看www.domain.com/profile .php如果我访问了www。注销前的版本。反之亦然,我可以从www.domain.com/logout.php注销,仍然可以查看domain.com/profile.php。有没有办法删除子域中的所有cookie?

2 个答案:

答案 0 :(得分:1)

OP在评论中写道:

  

最后想通了,当子域发生变化时,会话正在创建一个单独的cookie。因此,注销将删除一个会话cookie但保留另一个会话cookie。解决方案是在启动它之前命名会话,因此它始终具有相同的名称:

$some_name = session_name("cool_session");
session_set_cookie_params(0, '/', '.domain.com'); session_start(); 

答案 1 :(得分:0)

使用'.domain.com'代替'domain.com'来处理所有子域名。