允许php会话继续到子域

我使用PHP会话(不是cookie,除了会话ID cookie)为所有的用户数据,当用户转到他们的个人资料user.mydomain.com他们立即“注销”,直到删除子域。

有没有办法接受来自所有域的会话,只要它的* .mydomain.com

这里有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池configuration中:

 php_value[session.cookie_domain] = .example.com 
  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'); 

安全被诅咒,如果你像我一样对不完整或不好的答案感到沮丧,那么这就是你的救世主。 它只是工作。

我知道这是相当古老的 – 但进一步扩大@ CTT的build议 – 我需要添加一个php.ini文件在每个子目录(这将执行php代码,并需要会话)与我的子域使用以下文本:

 suhosin.session.cryptdocroot=Off suhosin.cookie.cryptdocroot=Off 

我希望这有助于(我花了很多时间来弄清楚)。

改变核心function文件顶部的会话名称

  session_name('mysession'); 

然后使用下面的代码进入php页面

  session_set_cookie_params(0,"/",".example.com",FALSE,FALSE); setcookie(session_name(), session_id(),0,"/","example.com"); session_start(); 

最后更改子域的默认会话名称,并删除子域的核心function文件中的默认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,只需删除所有的function

  "mysession" string like session_name('mysession'), setcookie( "mysession", "",1,"/" ); 

然后检查浏览器的现有Cookie,只需删除域和子域的所有cookie,然后重复该过程。

另一个select,对我来说是强制会话的名称:

 session_name("myWebsite"); session_start(); 

是。 ini_set正在工作。 但记得要销毁浏览器的所有caching和cookie,以查看它的工作原理。

  1. 销毁浏览器的所有caching和Cookie
  2. 在你的xxx.example.comyyy.example.com ,你的PHP文件应该像这样开始。

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

我只是有这个问题,事实certificate我使用不同的php.ini文件的两个不同的子域。 这些ini文件指定了不同的session.save_pathvariables。 出于显而易见的原因,对于需要共享会话的所有子域,这需要是相同的。

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

这是一个很好的解决scheme,但不能在所有情况下使用它。 例如,当你不能依赖非会话cookie时,它将不起作用。

如果您正确使用它,这实际上必须工作。

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

例如,你需要把它放在session_start()之前,还要放在所有调用session_start()文件中