我有一个网站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.com
、test.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. */
};
?>