从子域名读取Javascript Cookies

13
在子域名a.test.com中,我试图读取在.test.com设置的cookies。如果我在JS中使用document.cookie,我只能获得来自a.test.com的cookies。如何从.test.com读取cookies的语法或路径是什么?
我非常确定你可以向上读取--从子域名到fqdn--但是你无法向下读取--从fqdn到子域名。
谢谢!

3
您应该使用RFC 2606建议的示例URL,例如example.com或.example TLD。 - Gareth
2个回答

10

在将cookie设置为 test.com example.com 时,请确保将cookie域指定为".test.com" ".example.com"。

例如:

your_key_name=your_key_value;domain=.example.com;expires=...

2
Ates表示,除非使用以句点为前缀的域正确设置了Cookie,否则您将无法从子域读取该Cookie。 - Gareth
1
那么你的意思是,如果设置正确,document.cookie 将隐式读取 .a.test.com 和 .test.com 的所有 cookie 吗? - zmonteca
感谢Gareth的参与并详细阐述了我的简短回答。 - Ates Goral
@AtesGoral,谢谢您的回复。我将发布一个新问题,因为我看到一些奇怪的行为。Cookie是由服务器在不同的子域上设置的。客户端无法看到此Cookie,但当我访问我的子域上的服务器时,它可以看到它。不确定使用https是否会引起任何问题? - dewd
@AtesGoral 感谢您对此保持兴趣。热情培养专业知识。您对我的观察的第一条评论是正确的。HttpOnly cookie 对 JavaScript 不可用,但对服务器是可用的。解决方案是使用 ajax 调用服务器来获取它。 - dewd
显示剩余6条评论

1

我需要通过cookie将Shopify变量传递到子域名,我能够在闭合的</body>标签之前添加以下Javascript代码:

<script>
  var nowCart = new Date();
  var timeCart = nowCart.getTime();
  var expireTimeCart = timeCart + 1000*36000;
  nowCart.setTime(expireTimeCart); // " + nowCart.toUTCString() + "
  document.cookie = "_count={{ cart.item_count }};domain=.example.com;expires=;SameSite=none;Secure=true";
</script>

在域名前使用 .是允许从该域名以及任何其他子域名读取cookie的。这也应该反过来适用。
在子域的关闭</body>标签之前,这是我用来读取cookie并进行操作的JavaScript代码:
<script>
function getCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}
var cookie_name = getCookie('_count');
var cartCount = document.getElementById('_count');
cartCount.innerHTML=cookie_name;
</script>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接