当前位置:  开发笔记 > 编程语言 > 正文

带有显式域的localhost上的Cookie

如何解决《带有显式域的localhost上的Cookie》经验,为你挑选了4个好方法。

我一定错过了一些关于cookie的基本知识.在本地主机上,当我设置在服务器端的cookie,明确指定域为localhost(或.localhost).某些浏览器似乎没有接受cookie.

Firefox 3.5:我在Firebug中检查了HTTP请求.我看到的是:

Set-Cookie:
    name=value;
    domain=localhost;
    expires=Thu, 16-Jul-2009 21:25:05 GMT;
    path=/

或者(当我将域设置为.localhost时):

Set-Cookie:
    name=value;
    domain=.localhost;
    expires=Thu, 16-Jul-2009 21:25:05 GMT;
    path=/

在任何一种情况下,都不会存储cookie.

IE8:我没有使用任何额外的工具,但cookie似乎也没有存储,因为它不会在后续请求中发回.

Opera 9.64: localhost和.localhost都工作,但是当我检查Preferences中的cookie列表时,域名设置为localhost.local,即使它列在localhost下(在列表分组中).

Safari 4: localhost和.localhost都可以工作,但它们在Preferences中始终列为.localhost.另一方面,没有显式域的cookie,它显示为localhost(无点).

localhost有什么问题?由于存在这么多的不一致,必须有一些涉及localhost的特殊规则.另外,我不完全清楚为什么域名必须以点为前缀?RFC 2109明确声明:

Domain属性的值不包含嵌入点或不以点开头.

为什么?该文件表明它必须对安全做些什么.我不得不承认我没有阅读整个规范(稍后可能会这样做),但听起来有点奇怪.基于此,在localhost上设置cookie是不可能的.



1> 小智..:

根据设计,域名必须至少有两个点; 否则浏览器会认为它们无效.(参见http://curl.haxx.se/rfc/cookie_spec.html上的参考资料)

在处理时localhost,必须完全省略cookie域.只要将它设置为""NULLFALSE代替的"localhost"是不够的.

对于PHP,请参阅http://php.net/manual/en/function.setcookie.php#73107上的注释.

如果使用Java Servlet API,请不要调用该cookie.setDomain("...")方法.


不确定为什么每个人都是+ 1'这个,我将cookie的域设置为null或false或空字符串,如果在localhost上它仍然不保存.
@Justin:嗯,你可能需要在设置cookie时完全省略`Domain =`参数.如果你只是将域设置为null或为空,那么你的框架可能会发送带有该值的`Domain =`参数,而不是省略它?检查例如Firebug.
我在RFC6265中没有看到关于域中两个点的任何内容:http://tools.ietf.org/html/rfc6265#section-5.2.3 .Net说为你所有的主机设置为".local"本地域名.这似乎与Opera/Safari一致http://msdn.microsoft.com/en-us/library/ckch3yd2.aspx
这个措辞有点差."设置为null或false或空字符串"应为"根本不设置cookie的'domain'部分." 例如,使用一个简单的测试来完全忽略cookie的域部分适用于localhost:`((domain && domain!=="localhost")?"; domain ="+ domain:"")
@Ralph,一百万谢谢,这件事让我疯狂了几个小时.希望将Domain设置为null(我在.Net服务器堆栈中)就像一个魅力.

2> xgretsch..:

我大致同意@Ralph Buchfelder,但是在我的本地机器上尝试复制具有多个子域(例如example.com,fr.example.com,de.example.com)的系统时,通过实验进行了一些扩展. OS X/Apache/Chrome | Firefox).

我已经编辑/ etc/hosts指向一些想象中的子域名为127.0.0.1:

127.0.0.1 localexample.com
127.0.0.1 fr.localexample.com
127.0.0.1 de.localexample.com

如果我正在处理fr.localexample.com并且我将domain参数保留为out,则cookie会正确存储到fr.localexample.com,但在其他子域中不可见.

如果我使用".localexample.com"的域名,cookie将被正确地储存fr.localexample.com,并且在其他子域可见.

如果我使用"localexample.com"域,或者当我尝试的域名只是"localexample"或"localhost"时,cookie就不会被存储.

如果我使用"fr.localexample.com"或".fr.localexample.com"域,则cookie会正确存储到fr.localexample.com,并且在其他子域中(正确)不可见.

因此,要求您在域中至少需要两个点似乎是正确的,即使我不明白为什么它应该是.

如果有人想尝试这个,这里有一些有用的代码:




Testing cookies



";
    setcookie("mycookie", $val, time() + 48 * 3600, '/', $domain);
}
print "
";
print "Cookie:
"; var_dump($_COOKIE); print "Server:
"; var_dump($_SERVER); print "
"; ?>



3> AmpT..:

localhost:你可以使用:domain: ".app.localhost"它会工作.在"域"参数需要1个或多个点的域名设置Cookie.然后,您可以在localhost子域中运行会话,例如:api.app.localhost:3000.


``domain:'127.0.0.1'``对我没用.
如果您使用的是本地域,则应选择此选项作为答案!在子域之前放置一个点可以解决我的问题.

4> Scott Munro..:

当使用显式域"localhost"设置cookie时,如下所示......

Set-Cookie:name = value; domain = localhost ; 到期=周四,2009年7月16日21:25:05 GMT; 路径= /

...然后浏览器忽略它,因为它不包括至少两个句点,并且不是七个特殊处理的顶级域之一.

...域必须至少有两(2)或三(3)个句点,以防止形式的域:".com",".edu"和"va.us".在下面列出的七个特殊顶级域之一中失败的任何域只需要两个句点.任何其他域名至少需要三个.七个特殊的顶级域名是:"COM","EDU","NET","ORG","GOV","MIL"和"INT".

请注意,上述期间数可能假定需要一个领先期.然而,在现代浏览器中忽略了这个时期,它应该可以阅读......

至少一(1)或两(2)个时期

请注意,domain属性的默认值是生成cookie响应的服务器的主机名.

因此,没有为localhost设置cookie的解决方法是简单地不指定域属性并让浏览器使用默认值 - 这似乎没有与domain属性中的显式值相同的约束.

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有