2012-02-05 29 views
9

我有一个网站www.example.com。这将有多个子域用于单个应用程序或程序。例如,login.example.com将允许用户登录网站,而system.example.com将允许用户访问信息系统,而forums.example.com则允许用户访问论坛。在多个子域之间共享SESSION变量

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

编辑: 我喜欢这个主意:

由于在脚本的第一件事:

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

可能重复? [允许php会话继承到子域](http://stackoverflow.com/questions/644920/allow-php-sessions-to-carry-over-to-subdomains) – Josh 2012-02-05 22:38:38

+2

你打算在所有的会话中使用SAME会话吗?的子域名,或者你希望会话信息被子域隔离?如果您曾经扩展并将一个子域移动到另一个物理服务器,那么如果您跨所有域共享会话,则这可能会产生问题。或者你必须切换到所有服务器都可以访问的基于内存/数据库的会话存储。 – drew010 2012-02-05 22:43:16

+0

我打算在所有子域上使用SAME会话。然而另一个缺点可能是我在一个服务器上有多个域。然后我会怎么做才能将会话保持在常规域名之间,但是只保留子域名? – 2012-02-06 16:52:24

回答

13

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

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

session.cookie_domain = ".example.com" 

同时检查manual为用于设置INI项不同的方法。

+0

如果您在拥有多个域的情况下使用托管服务,该怎么办?例如example1.com,example2.com,example3.com。那你会怎么做? – 2012-02-06 16:48:37

+1

在'.htaccess'文件中为您的每个域名添加'php_value session.cookie_domain .example.com' – 2012-02-06 17:12:19

+1

对不起,您应该添加“php_value session.cookie_domain .example.com?”正确? – 2012-02-06 17:58:12

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');

+0

如果您在拥有多个域名的情况下使用托管服务,该怎么办?例如example1.com,example2.com,example3.com。那你会怎么做? – 2012-02-06 16:49:17

+0

@KevinOluseunKarimu没有什么饼干,它不这样工作。您可以将会话ID附加到通往另一个域的链接,在另一个域中获得此会话ID并开始会话。有关共享会话文件夹的要求仍然存在。 – Cheery 2012-02-06 16:56:01

+0

我如何获得sessiom id放入链接? – 2012-02-06 17:02:30

2

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

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

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

+0

如果您在拥有多个域的情况下使用托管服务,该怎么办?例如example1.com,example2.com,example3.com。那你会怎么做? – 2012-02-06 16:50:32

7

我找到了解决我的问题:

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

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

3

,再创建你的PHP文件会议,在第一行中加入这一行:

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

我一直在现在这个兜兜了一段时间,什么工作对我来说是把下面的代码:

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

跨所有将使用会话变量的子域。我在我的索引php文件的开始处设置了它,它起作用。希望这会说清楚。