【问题标题】:Subdomain read and delete primary domain cookie子域读取和删除主域cookie
【发布时间】:2018-08-19 04:23:28
【问题描述】:

我需要从我的主域中设置一个 cookie,读取然后从子域中删除 cookie。但是我还需要将来在域上再次设置该 cookie,然后在子域上读取它。基本上,单向通信流。我不能让主域句柄取消设置 cookie,因为用户访问主域和子域之间可能需要几个月的时间。

我在我的域上设置了一个 cookie,如下所示:

document.cookie = "mycookie=testcookie;domain=example.com;max-age=31536000;";

我可以在另一个子域上正常访问它,例如:

document.cookie.replace(/(?:(?:^|.*;\s*)testcookie\s*\=\s*([^;]*).*$)|^.*$/, "$1");

然后我尝试从子域中杀死它:

document.cookie = "mycookie=;domain=example.com;max-age=0;";

那行不通。 Cookie 仍然设置。

但是,像这样设置它会清除它:

document.cookie = "mycookie=;domain=example.com;max-age=31536000;";

当从子域请求它时,它现在返回""

但是……如果我回到域重新设置,可以看到已经设置,子域仍然返回""

是否存在某种...我缺少的 cookie 层次结构?我不确定这是如何表现或如何克服这一点。

【问题讨论】:

  • 尝试使用 .example.com 进行设置,第一个句点很关键。
  • @forrestmid 为 setter 和 unsetter 添加了前导句点,行为没有变化
  • 确保先清除网站的 cookie。如果有任何 cookie 没有句点,那么您仍然无法覆盖。我最近刚刚在我的网站上实现了一个类似的功能,当我不使用句号时遇到了同样的问题,而且我很难确保没有句号就不会设置另一个 cookie。
  • @forrestmid 一直在使用新的隐身,还手动删除了所有相关站点的站点数据。我可以确认代码设置和尝试重置 cookie 现在都使用.example.com 字符串,如下所示:document.cookie = "mycookie=;domain=.example.com;max-age=0;"; - 仍然没有雪茄
  • 请问您使用的是什么域?我在使用 ngrok.io 进行测试时遇到了一些问题。显然有一个公共域注册表,人们可以向其发布子域(如 aws、heroku 等),浏览器阻止在根域设置/访问/删除 cookie。

标签: javascript cookies


【解决方案1】:

为了启用此功能,您必须在根域之前放置一个句点 .,如下所示:.example.com 这很重要,因为设置 cookie 标准化的方式。这种格式应该与大多数现代浏览器兼容。

此外,跨不同子域访问或修改 cookie 时,路径必须相同。最简单的方法是使用域的根路径/。例如,如果您从sub1.example.com/page1 设置cookie 并尝试从sub2.example.com/page2 访问它,即使您将域设置为.example.com,您也必须设置path=/ 才能访问它并从其他子域上的任何路径。

最终:

document.cookie = "mycookie=testcookie;domain=.example.com;path=/;max-age=31536000";

将使您能够设置它并

document.cookie = "mycookie=;domain=.example.com;path=/;max-age=0";

会让你删除它。

【讨论】:

  • 只是澄清一下,在最新 (2011) 被广泛采用的 rfc6265 下,前导点不再需要了
猜你喜欢
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
  • 2013-06-19
  • 1970-01-01
  • 2012-06-25
  • 2014-11-18
  • 2014-09-01
相关资源
最近更新 更多