2011-04-15 69 views
72

以下是在用户计算机上写入12个月的JavaScript Cookie。在域上创建JavaScript Cookie并通过子域读取它

当我们在我们的主域如example.com上设置了cookie后,如果用户访问像test.example.com这样的子域,我们需要继续在我们的“测试”子域中标识用户的活动。

但是对于当前的代码,只要他们离开www.example.com并访问test.example.com,它们不再被标记为“HelloWorld”。

任何人都可以帮助我的代码,以允许cookie跨子域读取?

<script type="text/javascript"> 
    var cookieName = 'HelloWorld'; 
    var cookieValue = 'HelloWorld'; 
    var myDate = new Date(); 
    myDate.setMonth(myDate.getMonth() + 12); 
    document.cookie = cookieName +"=" + cookieValue + ";expires=" + myDate; 
</script> 

回答

154

只需设置你的Cookie中的domainpath属性,如:

<script type="text/javascript"> 
var cookieName = 'HelloWorld'; 
var cookieValue = 'HelloWorld'; 
var myDate = new Date(); 
myDate.setMonth(myDate.getMonth() + 12); 
document.cookie = cookieName +"=" + cookieValue + ";expires=" + myDate 
        + ";domain=.example.com;path=/"; 
</script> 
+0

我试图在localhost中执行此操作,但我无法更改路径 – Enve 2013-01-15 10:01:57

+6

@Enve - 浏览器将localhost cookie与其他cookie有所不同。或者说,他们以一种使_localhost_工作变得困难的方式来对待所有的cookie。例如,请参阅http://stackoverflow.com/questions/1134290/cookies-on-localhost-with-explicit-domain。我建议编辑你的'hosts'文件并将别名'myserver.local'别名到'127.0.0.1'。然后你可以使用它来访问你的本地服务器(以及设置cookie的时候),并且希望所有的东西都能正常工作。 – aroth 2013-01-16 00:32:09

+3

您创建和检索的所有Cookie值都必须是字符串值。字符串可能包含字符,当试图检索它们时可能会扰乱本地存储。我建议的一件事情是使用全局的'encodeURI()'&'decodeURI()'方法来处理任何需要进行的转换。即'document.cookie = encodeURI(cookieName)+“=”+ encodeURI(cookieValue)'。 – 2013-09-24 19:34:45

24

你想:

document.cookie = cookieName +"=" + cookieValue + ";domain=.example.com;path=/;expires=" + myDate; 

按照该RFC 2109,有提供给所有子域名的cookie,你必须把.在您的域名前面。

设置路径= /将使cookie在整个指定域内(又名.example.com)可用。

+0

感谢您对这个您的支持。 – Evan 2011-04-15 01:42:47

+0

FWIW - 我认为您需要删除“path = expires =”部分并将其设置为“expires =”。 – malonso 2012-01-11 15:13:48

+2

根据最新的[RFC 6265](http://tools.ietf.org/html/rfc6265),不再需要在域前加上'.'。 – Dan 2015-06-01 15:32:50

3
document.cookie = "testCookie=cookieval; domain=." + 
location.hostname.split('.').reverse()[1] + "." + 
location.hostname.split('.').reverse()[0] + '; path=/" 

这是一个通用的解决方案,从位置需要的对象的根域和设置cookie。倒退是因为你不知道你有多少个子域名。

+1

它不工作,如果你有一个域像“.com.co” – nikoskip 2016-10-18 18:25:42