我正在使用CI。 我想在子域名上分享会话 我正在使用数据库存储会话
我试过这个
ini_set('session.cookie_domain', substr($_SERVER['SERVER_NAME'],strpos($_SERVER['SERVER_NAME'],"."),100));
if(session_id ==''){session_start();}
这意味着x.y.com和z.y.com将使用共同会话 帮助我,请
答案 0 :(得分:5)
考虑到您已经知道自己的域名,是否有理由使用substr来确定它?如果您刚刚使用,可能会更具可读性:
ini_set('session.cookie_domain', '.domain.tld');
对于跨多个子域工作的cookie,cookie域必须以点(。)开头,后跟所有子域的公共部分(很可能是domain.tld。)
此外,您的帖子的第二行,您检查是否需要启动会话的那一行是错误的。你在session_id之后缺少一组括号,因为它是一个函数,而不是一个常量。条件语句(if)总是会失败,导致每次都调用session_start()。
if ( empty(session_id()) ) session_start();
答案 1 :(得分:5)
在更改其他会话设置和开始新会话之前设置新的 session.name 。 见下面的注释:
//Name your session for changes to be applied to.
session_name('my_session'); //Any arbitrary short name. Must have at least on letter char.
//Force a common cookie domain to apply to all subdomains.
ini_set('session.cookie_domain', '.domain.com'); //Change '.domain.com' accordingly.
//Start the Session if session_id() returns nothing.
if( empty( session_id() ) ) { session_start(); }
这一直对我有用。关于这个的php.net文档很少,但它似乎是社区中许多人的共识。
答案 2 :(得分:1)
我假设上面的内容将进入处理登录并开始会话的登录文件?
我的登录文件中有以下代码。是的,我是一个剪切和粘贴编码器:)
这是否意味着它应该跨子域工作,因为它说它是持久会话?
@session_start();
$usersession = generate_session(100);
$host_name = '.'.str_replace('www.','',$_SERVER['HTTP_HOST']);
if($_POST['persistent'] == 'yes'){
setcookie("usersession", $usersession, time()+ ($_POST['persistentFor']*7*24*60*60), "/", $host_name, 0);
}
$_SESSION['usersession'] = $usersession;
$user_ip = get_ip();
$insert_session = @mysql_query("INSERT INTO `memb_usersessions`
(`session_id`,`user_id`,`session_date`) VALUES ('$usersession','$get_user[user_id]',NOW())");