我为所有用户数据使用php会话(不是cookie,会话ID cookie除外),当用户访问他们的个人资料user.mydomain.com时,他们会立即“退出”,直到删除子域。
有没有办法接受来自所有域的会话,只要它的* .mydomain.com
答案 0 :(得分:81)
以下是4个选项。
将它放在你的php.ini中:
session.cookie_domain = ".example.com"
或者在.htaccess中:
php_value session.cookie_domain .example.com
或者作为脚本中的第一件事:
ini_set('session.cookie_domain', '.example.com' );
或者在您网站的php-fpm池配置中:
php_value[session.cookie_domain] = .example.com
答案 1 :(得分:12)
if(isset($_COOKIE['session_id']))
session_id($_COOKIE['session_id']);
Zend_Session::start(); //or session_start();
if(!isset($_COOKIE['session_id']))
setcookie('session_id', session_id(), 0, '/', '.yourdomain.com');
如果你像我一样对不完整或不好的答案感到沮丧,这就是你的救世主。它只是有效。
答案 2 :(得分:5)
更改核心功能文件顶部的会话名称 像
session_name('mysession');
然后使用以下代码进入php页面
session_set_cookie_params(0,"/",".example.com",FALSE,FALSE);
setcookie(session_name(), session_id(),0,"/","example.com");
session_start();
最后更改子域的默认会话名称,并删除子域核心功能文件中的默认cookie 像:
/*default session name*/
session_name("mysession");
/*remove the PHPSESSID and default session name from subdomain's cookie*/
setcookie( "mysession", "",1,"/" );
setcookie( "PHPSESSID", "",1,"/" );
如果您继续将Cookie名称用作PHPSESSID,只需使用
删除所有功能即可 "mysession" string like session_name('mysession'), setcookie( "mysession", "",1,"/" );
然后检查浏览器的现有Cookie,只需删除域和子域的所有Cookie,然后重复此过程。
答案 3 :(得分:4)
我知道这已经很老了 - 但为了进一步扩展@ CTT的建议 - 我需要在我的子域的每个子目录(将执行php代码并需要会话)中添加一个php.ini文件以下文字:
suhosin.session.cryptdocroot=Off
suhosin.cookie.cryptdocroot=Off
我希望这会有所帮助(我花了很长时间才弄清楚这一点。)
答案 4 :(得分:3)
另一个对我有用的选择是强制会话名称:
session_name("myWebsite");
session_start();
答案 5 :(得分:3)
是肯定的。 ini_set
正在发挥作用。但请记住销毁浏览器的所有缓存和cookie以使其正常工作。
在xxx.example.com
和yyy.example.com
中,您的php文件应该像这样开始。
ini_set('session.cookie_domain', '.example.com' ); session_start();
答案 6 :(得分:0)
我刚遇到这个问题,事实证明我正在为两个不同的子域使用不同的php.ini文件。这些ini文件指定了不同的session.save_path个变量。出于显而易见的原因,对于需要共享会话的所有子域,这需要相同。
答案 7 :(得分:0)
试试这个:
session_start();
$sessionId = session_id();
记录用户。当用户切换到其他子域时,会在URL中发送会话ID,如user.mydomain.com/?id=$sessionId
$sessionId = $_GET['id'];
session_start($sessionId);
现在,用户将获得所有会话值并保持登录状态。
答案 8 :(得分:0)
在session_start()
之前使用session_set_cookie_params()
用您的域替换 .domain.com ,例如:
session_set_cookie_params(0, '/', '.domain.com');
session_start();
答案 9 :(得分:-3)
if(isset($_COOKIE['session_id']))
session_id($_COOKIE['session_id']);
Zend_Session::start(); //or session_start();
if(!isset($_COOKIE['session_id']))
setcookie('session_id', session_id(), 0, '/', '.yourdomain.com');
这是一个很好的解决方案,但您无法在所有情况下使用它。例如,当您不能依赖非会话cookie时,它将无法工作。
如果你正确使用它,这实际上必须有效。
ini_set('session.cookie_domain', '.example.com' );
例如,您需要将其放在session_start()
之前以及所有调用session_start()