【问题标题】:Set cookie from main domain for subdomain从主域为子域设置 cookie
【发布时间】:2013-01-28 20:13:49
【问题描述】:

我有一个网站,由三个域组成:domain.comsub1.domain.comsub2.domain.com

我现在想通过 sub1.domain.com 上的 AJAX 在 domain.com 上设置一个 cookie 的页面。此 cookie 必须对所有三个域都可用。

我试过了:setcookie('name','value',time()+3600,'/','.domain.com'); 并且我试过了:setcookie('name','value',time()+3600,'/','domain.com');(注意域名前的点,有人告诉我旧的浏览器不会接受它。)但这不起作用。实际上,没有设置 cookie。

如何为来自子域的 AJAX 请求设置 cookie?我已经将 header('Access-Control-Allow-Origin: *'); 添加到了 setcookie 页面。

【问题讨论】:

  • 为了发送跨域 cookie,您需要 withCredentials 标志。根据请求方式,可能还需要Access-Control-Allow-Credentials: true
  • 我在代码中加了,问题还是一样。
  • 我会在正确的答案中澄清。
  • 我不确定但 ini_set('session.cookie_domain', '.domain.com');

标签: php cookies


【解决方案1】:

使用凭据时需要做几件事:

  • withCredentials标志

AJAX 请求需要设置xhr.withCredentials = true;

  • Access-Control-Allow-Credentials

服务器还必须回复header('Access-Control-Allow-Credentials: true');

  • 不允许通配符来源

当指定withCredentials 时,服务器不能允许* 的来源。因此,您必须使用有效域列表进行响应:

header('Access-Control-Allow-Origin: http://sub1.domain.com,http://sub2.domain.com');

如果您仍然想要一个任意的子域列表,您可以执行以下操作:

if (substr($_SERVER['HTTP_ORIGIN'], -11) === '.domain.com') {
    header('Access-Control-Allow-Origin: ' . $_SERVER['HTTP_ORIGIN']);
}

这会将允许的来源设置为 Origin 请求标头的值,但前提是它位于您的域中。

【讨论】:

  • 很遗憾没有。我刚刚开始起草一个这样的编辑:-)
  • 别担心!仅供参考,谷歌浏览器在这些场景的控制台上提供了非常有用的错误消息。