PHP设置cookie域

28

有一个应用程序不是由我编写的,也不是用PHP编写的,它为域名www.example.com创建了一个cookie。

我正在尝试替换那个cookie。因此,在PHP中我做了以下操作:

setcookie('mycookie','mydata',time() + 2*7*24*60*60,'/','www.example.com', false);

然而,生成的Cookie是为域名.www.example.com创建的,注意域名前面的点号“.”。

因此它并没有替换掉原有的Cookie,而是创建了另一个Cookie。


域名 www.domain.com.www.domain.com(注意前导点)在RFC 6265中至少被视为相同,这是每个现代浏览器实现的。它说前导点只是被忽略。但如果cookie不能成功地互相覆盖,这可能是由于“路径”、“域”、“安全”或“httpOnly”的属性差异,我们在此无法看到。一般来说,您可以尝试使用https://github.com/delight-im/PHP-Cookie来更轻松地管理cookie。 - caw
3个回答

42

这个问题在这里也得到了解决:

https://www.php.net/manual/zh/function.setcookie.php

请看jah的评论:

如果你想将cookie限制为单个主机,请将域参数设置为空字符串

你还可以尝试使用.example.com作为域名。最后的句点将允许对example.com的所有子域进行cookie控制,并可能覆盖www.的cookie,但我首先会采用上述解决方案。


1
我也在寻找答案,果然,将域留空就可以了。谢谢。 - Andrew Ensley
1
请注意,如果您将空字符串用于域名,可能会导致某些浏览器混淆。如果可以,请使用getenv('HTTP_HOST')。 - thomas-peter

7
如果您指定了一个域名,应该遵循RFC 2109并在域名前加上一个点;否则客户端将会这样做。但是如果您根本没有指定域名,客户端将采用请求的域名。

2
这个默认行为在哪里有记录? - marcovtwout
如果服务器未指定Cookie的域和路径属性,则它们默认为请求资源的域和路径。 - sosNiLa

-3
尝试创建几个具有相同名称但不同域的其他cookie。例如:
setcookie('mycookie','mydata1',time() + 2*7*24*60*60,'/','www.example.com', false);
setcookie('mycookie','mydata2',time() + 2*7*24*60*60,'/','www.example.com', false);
setcookie('mycookie_top','mydata1',time() + 2*7*24*60*60,'/','example.com', false);
setcookie('mycookie_top','mydata2',time() + 2*7*24*60*60,'/','example.com', false);

然后在 Firebug 中检查这些命令创建的 cookie。如果您不断获得双倍 cookie,则可能是 PHP 中的 bug。此外,尝试在 JavaScript 代码中设置 cookie,看看是否仍然遇到相同的问题。


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