【问题标题】:PHP Sessions with multiple Subdomains on the same Server在同一服务器上具有多个子域的 PHP 会话
【发布时间】:2015-02-07 12:09:26
【问题描述】:

我有一些关于 PHP 会话的问题,我无法通过我找到的页面弄清楚。

但首先是一些一般信息,我想在一台服务器上创建多个子域,

sub1.domain.com --> 10.10.10.10(服务器的示例 IP)

sub2.domain.com --> 10.10.10.10(服务器的示例 IP)

sub3.domain.com --> 10.10.10.10(服务器的示例 IP)

所有这些子域都可以使用相同的文件,但它们需要有自己的会话,例如,如果我在 sub1 上登录并打开 sub2,我需要为这个子域注销。

  1. 谁能解释一下这是如何工作的?
  2. 这如何与多个服务器一起工作(例如轮询 dns),是否所有服务器都知道例如 sub1 的会话?

【问题讨论】:

    标签: php session dns subdomain


    【解决方案1】:

    默认情况下,PHP 使用 'PHPSESSID' cookie 来跨多个页面传播会话数据,并且默认情况下它使用 cookie 声明中的当前顶级域和子域。

    例如:www.domain.com

    这样做的缺点是会话数据无法与您一起传输到其他子域。因此,如果您在 www.domain.com 上启动会话,则会话数据在 forums.domain.com 上将变得不可用。解决方案是更改 PHP 在设置 'PHPSESSID' cookie 时使用的域。

    假设您有一个包含在每个 PHP 页面顶部的 init 文件,您可以使用 ini_set() 函数。只需将其添加到您的初始页面顶部:

    ini_set('session.cookie_domain', substr($_SERVER['SERVER_NAME'], strpos($_SERVER['SERVER_NAME'],"."), 100));

    这行代码获取域并删除子域。

    示例:forums.domain.com -> .domain.com

    现在,每次 PHP 设置 'PHPSESSID' cookie 时,该 cookie 将可用于所有子域!


    你需要

    ini_set("session.cookie_domain", ".mydomain.com");

    在任何创建会话 cookie 的页面上的 session.start() 函数之前添加它。

    或者,您可以添加:

    session.cookie_domain = .mydomain.com

    到 php.ini

    在尝试之前,请确保您已清除 cookie。

    【讨论】:

    • 还有一个问题,当我用 domain2.com 对 sub1.domain.com 进行 AAA-Record 并通过 domain2.com 打开页面时,这可以解决问题吗?
    猜你喜欢
    • 2012-01-20
    • 2015-12-23
    • 2010-09-19
    • 2013-04-21
    • 2014-07-11
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    相关资源
    最近更新 更多