2017-01-30 80 views
0

我很困惑PHP会话处理。这是场景:PHP会话和iFrame

客户端浏览器访问server-a.domain-1.com,它将server-b.domain-2.com上的页面内容加载到iframe中。

客户端从服务器a获取会话cookie;可以说它的值是123.如果我在服务器b上回显session_id(),它会在iframe中显示一个不同的会话ID,比如456,但是在客户端没有cookie。当然,如果我直接加载server-b页面,我会得到它的cookie,然后有2个会话cookie,123和456.

我不明白这是什么。我删除所有的cookie并加载服务器a的页面,所以现在我有它的cookie(123)。在iframe中呈现的页面显示会话ID 456,但其Cookie不在客户端上。现在,每次我在服务器a上重新加载页面时,server-b都显示相同的session_id,但客户端永远不会获取它的cookie。

那么,如果没有cookie,server-b如何知道这是相同的会话?

从我的阅读中,我明白会话可以动态添加为url参数,如果cookie不可用,但这需要session.use_trans_sid在php.ini中设置,而不是。地址栏中也没有证据表明发生了这种情况。

我很感谢任何有关这里实际发生的事情。

回答

0

在默认配置PHP中将会话数据存储在硬盘上。当你想在两台不同的服务器上使用会话时,你必须建立共享会话。例如,这可以使用memcache完成。

在您的设置中,服务器server-a.domain-1.com将会话存储在他的硬盘上。当你将会话ID发送到server-b.domain-2.com时,他试图从他的硬盘读取会话。这将失败并创建一个新的会话。或者在情况下,它会加载另一个不属于原始会话的会话。

+0

我知道我可以设置会话共享,但这不是问题的本质。如果服务器b在每次将页面加载到iframe时加载了另一个会话,我都会理解它。但事实并非如此,它每次都有相同的会话。唯一合乎逻辑的答案是server-b正在将会话与server-a的会话相关联,尽管我没有在代码中做任何事情来实现这一点。 – johnoathome

+1

顺便说一句,我是比较新的SO,我不确定为什么我的问题被拒绝投票?如果这是一个人们开始学习的论坛,那么仅仅因为有人认为它是一个愚蠢的问题就会使投票产生反作用。 – johnoathome