在多个子域之间共享SESSION变量


Sharing SESSION Variables Between Multiple Subdomains

我有一个网站www.example.com。它将有多个子域,可以与单个应用程序或程序一起使用。例如,login.example.com将允许用户登录网站,system.example.com则允许用户访问信息系统,而forums.example.com则允许该用户访问论坛。

我们可能需要在子域之间传递信息,如用户id或用户偏好等。我们如何使用SESSION变量在子域之间传输信息?

编辑:我喜欢这个想法:

作为脚本中的第一件事:

ini_set('session.cookie_domain', '.example.com' ); 

1)子域应该使用相同的路径来保存会话文件

2) 修改

php.ini session.cookie_domain = ".example.com"

或.htaccess php_value session.cookie_domain .example.com

或脚本ini_set('session.cookie_domain', '.example.com' ); 内部

PHP会话ID保存在Cookie中要使cookie在所有子域中可用,您需要将其分配给根域。然后所有子域都会从cookie中获得会话id,PHP可以使用传递的会话id找到会话。

事实证明,您只需要在php.ini文件中将session.cookie_domain设置为根域

session.cookie_domain = ".example.com"

还可以查看手册中用于设置ini条目的不同方法。

我找到了解决问题的方法:

session_name("2620368ghwahw90w");
session_set_cookie_params(0, '/', '.mydomain.com');
session_start();

这似乎没有问题。这是一个安全风险低的好方法吗?

在php文件中创建会话之前,请在第一行添加此行:

<?php
//session cross to sub domain
ini_set('session.cookie_domain', substr($_SERVER['SERVER_NAME'],strpos($_SERVER['SERVER_NAME'],"."),100));

您可以使用cookie。检查setcookie()中的path参数,该参数使cookie可用于整个域。缺点是人们关闭cookie(私人浏览模式)

另一种方法是使用链接或隐藏的<input>字段(用于表单)传递sessionID。

由于独立的网站不共享会话(据我所知,子域在技术上是"不同的地方"),所以不要使用会话存储在服务器端。相反,使用数据库来处理会话。这样,多个站点可以共享同一个会话跟踪表。

要在子域之间共享会话cookie,您必须将cookie的域设置为.example.org(注意点)。

http://www.php.net/manual/en/session.configuration.php#ini.session.cookie-域

我已经对此进行了一段时间的研究,对我有效的是将代码放在下面:

session_name("some_session_name"); session_set_cookie_params(0, '/', '.some_domain.com'); session_start();

跨所有将使用会话变量的子域。我在索引php文件的开头设置了这个,它就可以工作了。希望这能说明问题。

工作起来很有魅力!

我相信最干净的方法是在.env中创建一个变量SESSION_DOMAIN=.example.com

或者,您可以打开config/session.php并设置'domain' => env('SESSION_DOMAIN', '.example.com'),所有子域,例如domain.example.comtest.example.com甚至example.com共享同一会话

这应该适用于大多数情况,如果不是全部的话:

<?php
if (!session_id()) /* If session is not started yet, then... */
    {
        ini_set('session.cookie_domain', substr_count($_SERVER['SERVER_NAME'],'.') > 1 ? ('.'.substr($_SERVER['SERVER_NAME'], strpos($_SERVER['SERVER_NAME'], '.') + 1)) : ('.'.$_SERVER['SERVER_NAME']));
        session_start(); /* Start session now. */
    };
    
?>