如何在PHP中设置特定子域的会话?

时间:2017-12-13 07:12:22

标签: php apache .htaccess session cookies

我的主域名中存在登录页面。我想设置一些特定的子域名。

假设我的登录页面为example.com成功登录后,我的页面将转到cms.example.comadmin.example.com。会话应该存储这三个example.comcms.example.comadmin.example.com而不是其他子域。

目前我的会话仅限example.com,但我无法在2个以上的子域中获得任何会话。

我在Allow php sessions to carry over to subdomains |找到了一些相关的问题和答案Set session cookies for specific subdomains但是这是为所有域设置的。这是问题所在,因为我还有其他子域名,例如user.example.comstudio.example.comdemo.example.com等。

如何为特定域和子域设置会话?

2 个答案:

答案 0 :(得分:0)

会话无法转到子域。如果要将会话发送到2个不同的子域而不是其他子域,我建议使用cookie并将其设置为包含子域的特定文件夹。如果那不是你想要的,你可以为所有子域设置它:

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

答案 1 :(得分:0)

我假设您已经包含takes the domain and lops off the sub domain.的文件
我有类似的问题。我通过这个技巧解决了它。

方法1:

在会话之前添加前缀,以区分子域的会话。 例如:$_Session["cms.id"], $_Session["admin.id"]

方法2:

为包含属性的会话和您要存储的其他信息创建一个类。

class CustomSessions{
private $domain;
private $userId;

/**
 * @return mixed
 */
public function getDomain()
{
    return $this->domain;
}

/**
 * @param mixed $domain
 */
public function setDomain($domain)
{
    $this->domain = $domain;
}

/**
 * @return mixed
 */
public function getUserId()
{
    return $this->userId;
}

/**
 * @param mixed $userId
 */
public function setUserId($userId)
{
    $this->userId = $userId;
}

}

现在,您可以创建CustomSession对象,并使用您希望该会话使用的域设置 $ domain

$obj = new CustomSession();
$obj->setDomain("cms.example.com");

然后,您可以在子域中检查$ domain的值,并相应地输入您的逻辑。

if($obj->getDomain()=='cms.example.com'){
// your code goes here
}