本地主机上的Cookies与显式域名

285

我可能对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 都可以正常工作,但是当我在首选项中检查 cookie 列表时,域名设置为 localhost.local,尽管它在 localhost 下列出(在列表分组中)。
Safari 4:localhost 和 .localhost 都可以正常工作,但是它们总是在首选项中列为 .localhost。另一方面,一个没有明确域名的 cookie,会显示为仅 localhost(没有点)。 localhost 的问题是什么?由于存在这么多不一致,必须有一些涉及 localhost 的特殊规则。而且,对我来说并不完全清楚为什么域名必须以点号开头。RFC 2109 明确规定:
“Domain 属性的值不包含任何嵌入的点或不以点开头。”
为什么?该文档指出这与安全有关。我必须承认我没有读完整个规范(可能稍后会读),但这听起来有点奇怪。基于此,在 localhost 上设置 cookie 将是不可能的。

44
六年前的帖子,但这仍然是一个问题。我正在使用Chrome v40。请参见此处 - Gaui
56
11年过去了,到了2020年,饼干问题仍然令人头疼,仍然无法解决。 - Otto
3
可能不是完全回答这个问题。在Chrome 80版本中,您可以在chrome://flags中禁用'Cookies without SameSite must be secure',以允许使用SameSite=NoneSameSite=Lax,而不仅仅是Secure。 - ntsd
25
13年过去了,到了2022年这仍然是个麻烦事。有趣的是,开发网络浏览器的公司中没有一个想到本地主机的请求不应受到cookie限制。 - user3491125
1
2022年11月21日,问题仍然存在。 - warmachine
显示剩余4条评论
25个回答

0

我在玩一下。

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

截至今日,它在Firefox和Chrome中有效。但是,我没有找到一种方法使其与curl一起工作。我尝试使用Host-Header和--resolve选项,但没有成功,非常感谢任何帮助。

但是,如果我将它设置为curl,则可以正常工作。

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

而是使用 <span> 代替(这在 Firefox 中也可以正常工作)。


0

这里的任何回答都不适用于我。我通过将我的PHP放在页面的非常非常前面来修复它。

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

来自http://php.net/manual/zh/function.setcookie.php


那与问题无关,这只是确保在头部之前不发送任何其他输出的错误。 - Marnes

0
感谢saied's的回答,将cookie选项设置为domain: ".localhost"secure: true在macOS上的Edge浏览器中起作用。然而,为了使Safari正常工作,我不得不将secure: false设置,这会导致Edge无法工作。

0
document.cookie = valuename + "=" + value + "; " + expires + ";domain=;path=/";

这个 "domain=;path=/"; 将使用动态域,并且其 cookie 将在子域中起作用。
如果你想在 localhost 上进行测试,它也会起作用。

-3
如果有人仍然遇到这个问题,我发现需要从post请求切换到get请求。
我正在使用axios,在前端使用withCredentials: true,但是这样会失败。将请求切换为get并更改后端以匹配即可解决问题。

这与cookies无关。你只是使用了错误的方法访问了一个端点。 - Koen van der Marel

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