跨子域和主机的Cookie

时间:2008-12-17 23:11:17

标签: php django apache iis cookies

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

使用随后的PHP代码在www.mydomain.com上设置cookie,我试图在另一台主机上从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上运行

如果我能提供更多信息以便更好地描述问题,请告诉我们!

5 个答案:

答案 0 :(得分:12)

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

问题在于您引入其他技术。例如,我已经知道通过Python模块发送PHP代码,允许Django提供PHP文件/内容,这会改变很多关于脚本可以访问的内容和非脚本的内容。

最终根据Marc Novakowski的建议发现了这一点,{{3}}建议将$_COOKIE发送到日志中以查找其中的内容。

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

道歉感谢所有回复此问题的人!

答案 1 :(得分:4)

在域中设置Cookie

'.aaa.sub.domain.com'

将与域

中设置的同名Cookie冲突

'.sub.domain.com'

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

这意味着(这需要花费一些时间才能通过)如果您要在多个域中使用同名的cookie,则必须在主/基域中设置一次(并且只需一次),在此case'.domain.com';否则,生成的cookie将不确定地随机返回到达,有时在.a.sub.domain.com中设置cookie'jasper',有时在.sub.domain.com中设置cookie'jasper',有时候是cookie' jasper'设置在.bcddomain.com中,有时在'.sub.domain.com'中设置cookie'jasper',有时在'.domain.com'中设置cookie'jasper'

答案 2 :(得分:3)

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

这是asumming'remote'是一个占位符而不是实际的子域名,当然你使用的是IE。虽然更多的浏览器可以很好地受到影响,但Fireworks并没有这样做。

答案 3 :(得分:1)

我尝试安装Charles Proxy并查看哪些标头是a)发送到Firefox开始(设置cookie)和b)哪些标头从Firefox发送到第二台服务器。至少可以通过这种方式缩小问题所在的位置(浏览器或服务器)。

答案 4 :(得分:-3)

从php.net关于setCookie - 功能:

  

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

     

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

基本上:你需要检查你的4.和5.参数:嗯,你的路径似乎很好,但域需要改变:

今天你阻止cookie到域A以外的所有其他人,但是你希望它对域A和域B都是可用的。这有点棘手,但可以解决。从15seconds获取灵感; - )