允许php会话转移到子域

时间:2009-03-13 23:00:00

标签: php apache session cookies

我为所有用户数据使用php会话(不是cookie,会话ID cookie除外),当用户访问他们的个人资料user.mydomain.com时,他们会立即“退出”,直到删除子域。

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

10 个答案:

答案 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以使其正常工作。

  1. 销毁浏览器的所有缓存和Cookie
  2. xxx.example.comyyy.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()

的文件中
相关问题