PHP cookie在不正确的域上写入

PHP cookie在不正确的域上写入,php,cookies,setcookie,Php,Cookies,Setcookie,我在我的应用程序中使用了一个cookie。看起来是这样的: +-------+-------+-----------------------+-------+----------+ | Name | Value | Domain | Path | Expires | +-------+-------+-----------------------+-------+----------+ | foo | bar | my.domain.tld

我在我的应用程序中使用了一个cookie。看起来是这样的:

+-------+-------+-----------------------+-------+----------+
| Name  | Value | Domain                | Path  | Expires  |
+-------+-------+-----------------------+-------+----------+
| foo   | bar   | my.domain.tld         | /     | Session  |
+-------+-------+-----------------------+-------+----------+
+-------+-------+-----------------------+-------+----------+
| Name  | Value | Domain                | Path  | Expires  |
+-------+-------+-----------------------+-------+----------+
| foo   | bar   | my.domain.tld         | /     | Session  |
| foo   | cat   | .my.domain.tld        | /     | Session  |
+-------+-------+-----------------------+-------+----------+
在脚本的一部分中,根据某些条件,我试图更改cookie的值。我正在使用以下代码:

// overwrite cookie
if($condition){
  setcookie("foo", "cat", 0, "/", "my.domain.tld");
}
之后,我的cookie数据如下所示:

+-------+-------+-----------------------+-------+----------+
| Name  | Value | Domain                | Path  | Expires  |
+-------+-------+-----------------------+-------+----------+
| foo   | bar   | my.domain.tld         | /     | Session  |
+-------+-------+-----------------------+-------+----------+
+-------+-------+-----------------------+-------+----------+
| Name  | Value | Domain                | Path  | Expires  |
+-------+-------+-----------------------+-------+----------+
| foo   | bar   | my.domain.tld         | /     | Session  |
| foo   | cat   | .my.domain.tld        | /     | Session  |
+-------+-------+-----------------------+-------+----------+
为什么要在域前面加一个
?我想覆盖现有的cookie。

答案将在php手册的一篇文章中讨论


Cookie数据由浏览代理设置,因此根据浏览器使用的过程进行不同的处理。

来自文档:

cookie可用的域。要使cookie在example.com的所有子域上都可用,您需要将其设置为“.example.com”。这个不是必需的,但使其与更多浏览器兼容。将其设置为www.example.com将使cookie仅在www子域中可用。有关详细信息,请参阅»规范中的尾部匹配

尾部匹配规格如下所示:


事实证明,指定任何域似乎都不起作用:

setcookie("foo", "cat", 0, "/");
预期cookie数据:

+-------+-------+-----------------------+-------+----------+
| Name  | Value | Domain                | Path  | Expires  |
+-------+-------+-----------------------+-------+----------+
| foo   | cat   | my.domain.tld         | /     | Session  |
+-------+-------+-----------------------+-------+----------+

奇怪,但它可以工作。

毫无意义,它必须设置为anything.domain.tld,否则在某个地方有一个很大的错误-我唯一敢建议的是,你再次检查并确保第一个cookie实际上没有设置为。anything,而不是第二个..Nathan,看起来它不是一个bug,而是一个常见的混淆源。请参阅下面的答案:)您可能会发现有帮助,如中所示。它负责规范化你提供的域名。我应该更具体一些。我所说的
anything
是指子域可以是任何东西。我不想把答案缩小到
www
特定的子域。更准确地说,我不希望cookie匹配域的所有子域。我更新了我的问题。