16

在我使用开发环境和语言组合编写的应用程序中,我需要从两个不同的子域访问一个 cookie,每个子域都在一个单独的主机上。

cookie 是www.mydomain.com使用后面的 PHP 代码设置的,我正在尝试从distant.mydomain.com单独的主机上访问它。

setcookie('token', base64_encode(serialize($token)), time()+10800, '/', '.mydomain.com');  

我正在尝试distant.mydomain.com使用以下代码访问 cookie:

if (isset($_COOKIE['token'])) { /* do stuff */ }  

问题:distant.mydomain.com没有找到cookie。 刚才提到的if语句返回 false,即使 cookie 存在。

我已经验证了设置的 cookie 是用于mydomain.com(通过检查我的 Firefox cookie)。我想不出任何原因这不起作用。

使用相同的setcookie代码,我有一个专门在www.mydomain.com主机上运行的旧应用程序,并且该应用程序能够跨域访问 cookie。这让我怀疑问题与单独的主机有关。

以防以下任何信息相关:
-www.mydomain.com是 IIS 6.0
-distant.mydomain.com是 Apache 2.2.9
- 两台服务器都使用 PHP 5.2.x
- 两台服务器都在 Windows Server 2003 上运行

如果我可以提供任何进一步的信息以便更好地描述问题,请告诉我!

4

5 回答 5

12

为了任何阅读此问题的人的利益,原始帖子中包含的代码和信息完全正确并且可以正常工作。

问题是当你引入其他技术时。例如,从那以后,我了解到通过 Python 模块发送 PHP 代码,一个允许 Django 提供 PHP 文件/内容的模块,极大地改变了脚本可访问的内容和不可访问的内容。

这最终是在Marc Novakowski的建议下发现的,他建议发送$_COOKIE到日志以找出那里有什么。

我还检查了$_SERVER$_GET。正是这种空虚感$_GET告诉我,我尝试使用的设置并不像我想象的那么简单。正是这种错误的理解导致在原始帖子中没有包含有关 Django 的信息。

道歉感谢所有回答这个问题的人!

于 2008-12-18T02:45:23.627 回答
4

在域中设置的 Cookie

'.aaa.sub.domain.com'

将与域中设置的同名 cookie 发生冲突

'.sub.domain.com'

'.some.stupidly.obscure.multi.sub.domain.com'

这意味着(这需要一些时间来完成)如果您要在多个域中使用同名 cookie,则必须在主/基本域中设置一次(并且仅一次),在这种情况下为 '.域名.com'; 否则,生成的 cookie 将不确定地随机返回,有时是 .a.sub.domain.com 中设置的 cookie 'jasper',有时是 .sub.domain.com 中设置的 cookie 'jasper',有时是 cookie' jasper' 设置在 .bcddomain.com 中,有时 cookie 'jasper' 设置在 '.sub.domain.com' 中,有时 cookie 'jasper' 设置在 '.domain.com' 中

于 2011-03-14T03:20:02.450 回答
3

子域之一是否使用下划线?IE 在接受来自不遵循 URI RFC 的子域的 cookie 时遇到问题。

这是假设“distant”是一个占位符,而不是实际的子域名,当然您使用的是 IE。尽管 as 可以很好地影响更多的浏览器,但 Fireworks 却没有。

于 2008-12-17T23:56:45.043 回答
1

我会尝试安装Charles Proxy并查看什么标头是 a)被发送到 Firefox 开始(设置 cookie)和 b)哪些标头正在从 Firefox 发送到第二个服务器。至少这样你可以缩小问题所在(浏览器或服务器)。

于 2008-12-18T00:38:06.117 回答
-3

来自 php.net 关于setCookie -function

cookie 可用的服务器上的路径。如果设置为“/”,cookie 将在整个域中可用。如果设置为 '/foo/',则 cookie 将仅在 /foo/ 目录和 domain 的 /foo/bar/ 等所有子目录中可用。默认值是设置 cookie 的当前目录。

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

基本上:需要检查您的 4. 和 5. 参数:嗯,您的路径似乎没问题,但需要更改域:

今天,您将 cookie 阻止给除域 A 之外的所有其他人,但您希望它对域 A 和 B 都可用。这有点棘手,但可以解决。在15 秒内获得灵感;-)

于 2008-12-17T23:59:13.103 回答