本地主机上的Cookie与显式域

我一定会错过一些关于cookies的基本知识。 在本地主机上,当我在服务器端设置一个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中的cookies列表时,即使列在localhost(在列表分组中),域也被设置为localhost.local。

Safari 4: localhost和.localhost都可以工作 ,但是它们总是在Preferences中被列为.localhost。 另一方面,一个没有显式域的cookie,只显示localhost(没有点)。

本地主机有什么问题? 由于这样的一些不一致之处,必须有一些涉及本地主机的特殊规则。 另外,我还不完全清楚为什么域名必须以点为前缀? RFC 2109明确规定:

“域”属性的值不包含嵌入的点或不以点开头。

为什么? 该文件表明,它必须做一些安全的事情。 我不得不承认,我没有阅读整个规范(以后可能会这样做),但这听起来有点奇怪。 基于此,在本地主机上设置cookie将是不可能的。

按照设计,域名必须至少有两个点; 否则浏览器会认为它们是无效的。 (请参阅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("...")方法。

我大致赞同@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,并且将域参数保留在外,则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中,并且在其他子域名中(正确)不可见。

因此,至少在域中至少需要两个点的要求看起来是正确的,尽管我不明白为什么应该这样做。

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

 <html> <head> <title> Testing cookies </title> </head> <body> <?php header('HTTP/1.0 200'); $domain = 'fr.localexample.com'; // Change this to the domain you want to test. if (!empty($_GET['v'])) { $val = $_GET['v']; print "Setting cookie to $val<br/>"; setcookie("mycookie", $val, time() + 48 * 3600, '/', $domain); } print "<pre>"; print "Cookie:<br/>"; var_dump($_COOKIE); print "Server:<br/>"; var_dump($_SERVER); print "</pre>"; ?> </body> </html> 

localhost:你可以使用: domain: ".app.localhost" ,它会工作。 “域名”参数在域名中需要一个或多个点来设置Cookie。 然后,您可以使用跨本地主机子域的会话,如: api.app.localhost:3000

结果我有不同的浏览器。

Chrome – 127.0.0.1工作,但本地主机。本地主机和“”没有。 Firefox- .localhost工作,但本地主机,127.0.0.1,和“”没有。

未在Opera,IE或Safari中进行测试

当Cookie被设置为“localhost”的显式域名时,如下所示:

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”这7个特殊的顶级域名。

请注意,以上时段的数量可能假设需要一个领先时段。 然而,这个时期在现代浏览器中被忽略了 ,它可能应该读取…

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

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

所以对于没有为localhost设置cookie的解决方法是简单地不指定域属性,并让浏览器使用默认值 – 这看起来没有像domain属性中显式值那样的约束。

我有更好的运气测试本地使用127.0.0.1作为域。 我不知道为什么,但是我与localhost和.localhost等结果混合在一起

没有建议的修补程序为我工作 – 将其设置为空,错误,添加两个点等 – 没有工作。

最后,我只是从cookie中删除域,如果它是本地主机,现在在Chrome 38中适用于我。

先前的代码(没有工作):

 document.cookie = encodeURI(key) + '=' + encodeURI(value) + ';domain=.' + document.domain + ';path=/;'; 

新的代码(现在工作):

  if(document.domain === 'localhost') { document.cookie = encodeURI(key) + '=' + encodeURI(value) + ';path=/;' ; } else { document.cookie = encodeURI(key) + '=' + encodeURI(value) + ';domain=.' + document.domain + ';path=/;'; } 

document.cookie = valueename +“=”+ value +“;”+ expires +“; domain =; path = /”;

这个“domain =; path = /”; 将采取动态域作为其cookie将在子域中工作。 如果你想在本地主机测试它将工作

从2011年开始 , Chromium就存在一个问题 ,即如果您明确将域设置为“本地主机”,则应将其设置为falseundefined

花了很多时间自己解决这个问题。

使用PHP,并没有在这个网页上为我工作。 我最终意识到在我的代码中, PHP的session_set_cookie_params()的'secure'参数总是被设置为TRUE。

由于我没有使用https访问本地主机,我的浏览器永远不会接受cookie。 所以,我修改了我的代码的一部分,有条件地设置基于$ _SERVER ['HTTP_HOST']'localhost'的'安全'参数。 现在运作良好。

我希望这可以帮助别人。

我正在玩一下。

 Set-Cookie: _xsrf=2|f1313120|17df429d33515874d3e571d1c5ee2677|1485812120; Domain=localhost; Path=/ 

在Firefox和Chrome中运行。 但是,我没有找到一个使卷曲工作的方法。 我试过主机头和 – 解决,没有运气,任何帮助表示赞赏。

但是,如果我把它设置为,它会在curl中起作用

 Set-Cookie: _xsrf=2|f1313120|17df429d33515874d3e571d1c5ee2677|1485812120; Domain=127.0.0.1; Path=/ 

代替。 (这不适用于Firefox)

另一个重要的细节, expires =应该使用以下日期时间格式: Wdy,DD-Mon-YYYY HH:MM:SS GMT ( RFC6265 – 第4.1.1节 )。

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

这里没有答案为我工作。 我通过把PHP作为页面中的第一件事来解决这个问题。

像其他头文件一样,Cookie必须在脚本输出之前发送(这是一个协议限制)。 这要求您在任何输出之前调用此函数,包括标记以及任何空格。

http://php.net/manual/en/function.setcookie.php