在多个子域之间共享会话变量

时间:2012-02-05 22:32:19

标签: php subdomain session-variables

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

我们可能需要在子域之间传递信息,例如用户ID或用户首选项等。我们如何使用SESSION变量在sudomains之间传递信息?

编辑: 我喜欢这个想法:

作为脚本中的第一件事:

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

8 个答案:

答案 0 :(得分:13)

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

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

session.cookie_domain = ".example.com"

同时检查manual以了解用于设置ini条目的不同方法。

答案 1 :(得分:9)

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

2)修改你的

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

或.htaccess php_value session.cookie_domain .example.com

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

内部

答案 2 :(得分:9)

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

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

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

答案 3 :(得分:3)

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

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

答案 4 :(得分:2)

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

另一种方法是passing the sessionID around using links或隐藏<input>字段(表单)。

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

我已经使用了一段时间了,现在对我有用的是下面的代码:

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

将使用会话变量的所有子域。我在我的索引php文件的开头设置它,它的工作原理。希望这会说清楚。

答案 7 :(得分:0)

像魅力一样工作!

我认为最干净的方法是在.env中创建变量SESSION_DOMAIN=.example.com

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