我一定是忽略了饼干的一些基本特性。在localhost上,当我在服务器端设置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都可以工作,但它们总是在首选项中列出为.localhost。另一方面,一个没有显式域的cookie,它只显示为localhost(没有点)。

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

Domain属性的值 不包含或不包含嵌入点 从一个点开始。

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


当前回答

Cookie需要指定SameSite属性,None值曾经是默认值,但最近的浏览器版本将Lax作为默认值,以对某些类型的跨站请求伪造(CSRF)攻击具有相当强大的防御能力。

除了SameSite=Lax,你还应该有Domain=localhost,这样你的cookie就会关联到localhost并被保存。它应该看起来像这样:

document.cookie = `${name}=${value}${expires}; Path=/; Domain=localhost; SameSite=Lax`;

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite

其他回答

我有一个类似的问题,我的后端和前端运行在本地主机,但不同的端口。为了解决这个问题,我在Set-Cookie中省略了域,并在我的请求选项中使用了凭据:true。

在这里看到的

Cookie需要指定SameSite属性,None值曾经是默认值,但最近的浏览器版本将Lax作为默认值,以对某些类型的跨站请求伪造(CSRF)攻击具有相当强大的防御能力。

除了SameSite=Lax,你还应该有Domain=localhost,这样你的cookie就会关联到localhost并被保存。它应该看起来像这样:

document.cookie = `${name}=${value}${expires}; Path=/; Domain=localhost; SameSite=Lax`;

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite

不同浏览器的结果也不同。

Chrome- 127.0.0.1工作,但localhost .localhost和“”不能。 Firefox- .localhost可以工作,但localhost、127.0.0.1和“”不能工作。

没有在Opera, IE或Safari中测试过

我在使用127.0.0.1作为域进行本地测试时运气要好得多。我不知道为什么,但我有混合的结果与localhost和.localhost等。

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

使用PHP,这个页面上的任何东西都不适合我。我最终在我的代码中意识到,PHP的session_set_cookie_params()的“安全”参数总是被设置为TRUE。

因为我没有用https访问localhost,我的浏览器永远不会接受cookie。所以,我修改了我的代码的那一部分,有条件地设置'安全'参数基于$_SERVER['HTTP_HOST']是'localhost'或不是。现在工作得很好。

我希望这能帮助到一些人。