【问题标题】:Share / delete cookie across subdomain (www) in php在 php 中跨子域 (www) 共享/删除 cookie
【发布时间】:2012-03-29 05:52:50
【问题描述】:

我有一个登录/注销系统,需要 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');

cookies 被删除,但仅限于当前域。因此,如果我从 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?

【问题讨论】:

  • 终于弄清楚了,当子域发生变化时,会话正在创建一个单独的cookie。因此,注销会删除一个会话 cookie,但会留下另一个。解决方案是在启动会话之前为其命名,使其始终具有相同的名称: $some_name = session_name("cool_session"); session_set_cookie_params(0, '/', '.domain.com'); session_start();

标签: php cookies save subdomain


【解决方案1】:

使用“.domain.com”而不是“domain.com”来处理所有子域。

【讨论】:

  • 我手动清除了浏览器(最新版本的 safari)中的所有 cookie,并尝试在登录 cookie 和注销 cookie 上添加 .domain.com,但仍然发生同样的事情。还有其他想法吗?
【解决方案2】:

OP 在评论中写道:

终于弄明白了,当子域发生变化时,会话正在创建一个单独的 cookie。因此,注销会删除一个会话 cookie,但会留下另一个。解决方案是在启动会话之前为其命名,使其始终具有相同的名称:

$some_name = session_name("cool_session");
session_set_cookie_params(0, '/', '.domain.com'); session_start(); 
猜你喜欢
  • 1970-01-01
  • 2011-11-27
  • 2012-09-15
  • 2013-02-13
  • 2020-01-13
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
相关资源
最近更新 更多