允许php会话转移到子域

Ant*_*ony 70 php apache cookies session

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

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

CTT*_*CTT 84

这里有4个选项.

把它放在你的php.ini中:

session.cookie_domain = ".example.com"
Run Code Online (Sandbox Code Playgroud)

或者在.htaccess中:

php_value session.cookie_domain .example.com
Run Code Online (Sandbox Code Playgroud)

或者作为脚本中的第一件事:

ini_set('session.cookie_domain', '.example.com' );
Run Code Online (Sandbox Code Playgroud)

或者在您网站的php-fpm池配置中:

php_value[session.cookie_domain] = .example.com
Run Code Online (Sandbox Code Playgroud)

  • 对像我这样愚蠢的人的另一个提醒:确保`ini_set('session.cookie_domain','.example.com');`来自_before_`session_start();` (9认同)
  • 别忘了实际关闭浏览器然后再打开它.否则你会去圈子!..我做到了 (6认同)
  • @CTT请在你的答案中添加第四个选项:`session_set_cookie_params(0,'/','example.com',false,false);` (4认同)
  • 不幸的是,所有3个都无法工作,是否需要有明星*? (2认同)
  • 很奇怪,我之前使用过那些方法,它们工作正常.您是否偶然安装了Suhosin,我记得有一个设置需要更改以允许这个吗?如果你不这样做,你可以发布更多关于你的安装的信息(例如apache,lighttpd,php版本)? (2认同)

suc*_*vel 13

        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');
Run Code Online (Sandbox Code Playgroud)

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

  • 这对我有用,但我不了解安全问题。您介意解释那里可能存在哪些安全问题吗? (3认同)

kar*_*san 5

更改核心函数文件顶部的会话名称

 session_name('mysession');
Run Code Online (Sandbox Code Playgroud)

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

  session_set_cookie_params(0,"/",".example.com",FALSE,FALSE);
  setcookie(session_name(), session_id(),0,"/","example.com");
  session_start();
Run Code Online (Sandbox Code Playgroud)

最后更改子域的默认会话名称,并删除子域的核心函数文件中的默认cookie,如:

 /*default session name*/
 session_name("mysession");
 /*remove the PHPSESSID and default session name from subdomain's cookie*/
 setcookie( "mysession", "",1,"/" );
 setcookie( "PHPSESSID", "",1,"/" );
Run Code Online (Sandbox Code Playgroud)

如果您继续使用您的cookie名称作为PHPSESSID,只需删除所有功能

 "mysession" string like session_name('mysession'), setcookie( "mysession", "",1,"/" );
Run Code Online (Sandbox Code Playgroud)

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