【问题标题】:Can't make cookies work for subdomain无法使 cookie 对子域起作用
【发布时间】:2013-05-21 15:01:06
【问题描述】:

更新:由于本地机器托管,特别是使用的短域名(如'.t'),它看起来不起作用。 具有实际(现实生活)域名使用情况的远程服务器上的相同代码可以正常工作。

有两个域(根域和它的子域)都在运行,查看同一个网络服务器的目录,因此,使用完全相同的脚本。 (我在家用计算机上的 Windows XP 上运行 Apache/PHP,因此我选择为本地主机使用短名称 - 分别为 't' 和 'a.t')。

session_set_cookie_params(
          24*3600, // 24 hours 
          '/',     // all paths
          '.t',    // 't' and all sub-domains
          FALSE,   // not secure
          FALSE    // not http-only
     ); 

session_start();

if ($_SERVER['HTTP_HOST'] == 't') 
    setcookie(
            'test',           // cookie name
            'yes',            // cookie value
            time() + 24*3600, // expires after 24 hours
            '/',              // all paths
            '.t',             // t and all subdomains
            FALSE,            // not secure
            FALSE             // not http-only
        );

echo $_SERVER['HTTP_HOST'] . '<br>';

print_r($_COOKIE);

这是我为根本地主机所拥有的:

t 
Array ( [PHPSESSID] => 23lhahncni8ekeqj3j02u7qlq5 [test] => yes )

对于子域:

a.t 
Array ( )

如您所见,子域的 $_COOKIE 数组是空的,尽管浏览器可以看到相应的 cookie(确切地说是 Firebug - 我可以在打开子域页面的选项卡中看到这两个 cookie)。 我不知道为什么会这样。

我需要访问两个域的 $_COOKIE[test]。我怎样才能做到这一点?

【问题讨论】:

  • session_set_cookie_params 仅为会话 cookie 设置选项,而不为使用 setcookie() 创建的 cookie 设置选项。
  • 我感觉你不是第一个遇到这个问题的人,所以我想知道你为什么要提出一个关于这个话题的新问题。
  • @hakre,因为我没有找到适合我的答案。我尝试了一些其他代码(类似于之前在此处发布的),但仍然无法正常工作 - 请参阅顶部消息(我已编辑)。
  • @hakre,实际上你(或其他人)指出的重复的帖子必须处理不同的网络服务器,此外,还有一些 python 的东西。我有完全相同的脚本,没有不同的网络服务器(不是说我没有 python 或任何其他涉及的东西)。因此,虽然我在发布之前确实找到了它,但我什至不认为这对我有用。
  • @hakre,我认为对于任何具有适当 PHP 知识水平的人所引用的代码,整个问题都很清楚。我仍然坚持这个问题不是重复的,因为这个问题与本地机器托管和使用的人工域名有关(我在最近的编辑中引入了问题文本),这与任何问题都不匹配地点。话虽如此,我终于让它在我的一个远程环境中工作,我对此感到满意,所以我不会做任何进一步的研究并假设这个案例已经结束。 我现在声称的只是删除重复标签

标签: php apache session cookies subdomain


【解决方案1】:

您需要在调用setcookie()时指定域:

setcookie('test', 'yes', 0, '/', '.t');

session_set_cookie_params() 仅设置用于保存$_SESSION 的cookie 的选项,而不是使用setcookie 设置的cookie。

【讨论】:

  • 嗯.. 没想到。实际上,它是一个会话 cookie。但至少会话 cookie(即 PHPSESSID)应该是可见的。事实并非如此。我修改了将参数添加到 setcookie() 的代码(请参阅最上面的消息 - 我已编辑),但它仍然不起作用:(
  • 您在setcookie 中指定的实际域是什么?它真的只有一个像.t 这样的组件吗?浏览器不会让你在这样的顶级域上设置 cookie。
  • 你是对的。它确实与这种人为的短域名有关。我在使用普通域名的环境中运行代码,它工作正常。感谢您的贡献。
猜你喜欢
  • 2014-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-04
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
相关资源
最近更新 更多