同一服务器,不同域名需要使用不同的会话。

4
我正在为多个域名实现登录和注册功能,这些域名都连接到同一个数据库 - 我们称之为i.domain-a.comi.domain-b.com。这两个子域名在DNS中都有A记录,指向同一台服务器 - 因此,i.domain-a.com/hello.phpi.domain-b.com/hello.php运行的是相同的内容。
因此,如果我在域A上创建一个会话,那么我可以转到域B并检索相同的会话信息。为了为它们分别实现完全独立的登录系统,并利用我编写的处理注册的相同PHP函数,我应该根据$_SERVER['HTTP_HOST']基于session_name()做些什么?我不确定我的情况是否与这个人类似,希望这个问题不要太相似。

我想除此之外,我应该问:如果为每个域使用不同的session_name()不是一个明智的选择,那么处理这个问题的最佳方法是什么? - Sam Starling
你还可以在每个域名的php应用程序的第一行使用init_set()函数来设置"session.cookie_domain" [类型:字符串]运行时指令(我的答案如下,但使用了对session_name()函数的调用)。 - Andreas
3个回答

3
为了避免会话问题,您应该使用session_name('myapplication') [ session_name({UNIQUE_APP_ID}) ]。
您提到的问题可能发生在更简单的情况下,例如存在管理面板和用于网站用户的登录表单。
如果不使用session_name,则已登录的用户可能会访问管理面板,但这取决于您实施的身份验证方案和机制。
此致,敬礼。

2
会话/cookie是特定于域的,不依赖DNS设置。如果您希望两个系统的会话在分别位于不同域时保持分离,则已经准备好了。
我认为对于那个人的问题,session_name()实际上是最好的解决方案,在同一域上使用两个独立的会话。

谢谢。我现在有一个调试页面,只显示会话ID。如果我访问i.domain-a.com/session.phpi.domain-b.com/session.php,我看到的是相同的内容。但是,如果在session_start();之前执行session_name($_SERVER['HTTP_HOST']);,然后针对每个域名分别获取不同的ID。 - Sam Starling
这是因为i.domain-a.com/session.php和i.domain-a.com/session.php是同一个页面。 - Quentin
会话 ID 是服务器特定的,但 cookie 是域特定的。用户的 cookie(每个域一个)将分别指向唯一的会话 ID,从而避免任何重叠。尝试设置一个设置会话变量的脚本和一个显示该变量的脚本。从一个域运行第一个脚本,从另一个域运行第二个脚本,直到第二个脚本从相同的域运行时,它都不应获取第一个脚本的值。 - nortron
如果有人手动将会话ID传递到PHP脚本中,他们可以(如果您想提供此功能,您也可以)在域之间传输会话数据。为了完全防止这种情况,您可以绝对使用session_name()/HTTP_HOST组合。 - nortron

0
不行。防止不同用户获取相同会话的机制是基于每个服务器而不是每个主机名的。

因此,考虑到这一点,是否可以在session_start()之前执行session_name($_SERVER['HTTP_HOST']);以便在同一服务器上为每个域分离会话? - Sam Starling
我也意识到实现以上功能会导致每次访问都生成一个新的ID,这并不理想。我希望在会话过期或被销毁之前保持相同的ID。对于如此迅速的回复,我表示歉意... - Sam Starling

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