允许 PHP 会话传递到子域

我对所有用户数据使用 PHP 会话(不是 cookie,除了 session id cookie) ,当用户访问他们的配置文件 user.mydomain.example时,他们会立即“注销”,直到删除子域。

是否有一种方法可以接受来自所有域的会话,只要它的 *.mydomain.example

79818 次浏览

这里有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
        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.example');

让安全见鬼去吧,如果你像我一样对不完整或糟糕的答案感到沮丧,这就是你的救世主。就是这样。

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

这是一个很好的解决方案,但是您不能在所有情况下都使用它。例如,当您不能依赖于非会话 cookie 时,它将无法工作。

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

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

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

我知道这是相当老-但进一步扩展@CTT 的建议-我需要添加一个 php.ini 文件在每个子目录(这将执行 php 代码,需要会话) ,我的子域下面的文本:

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

我希望这有所帮助(我花了很长时间才弄明白)。

另一个对我起作用的选择是: 强行确定会议的名称:

session_name("myWebsite");
session_start();

我只是遇到了这个问题,结果发现我对两个不同的子域使用了不同的 php.ini 文件。这些 ini 文件指定了不同的 Session. save _ path变量。出于显而易见的原因,对于需要共享会话的所有子域,这一点必须是相同的。

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

 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,然后重复这个过程。

是的。 ini_set正在工作。但是请记住销毁浏览器的所有缓存和 Cookie 来查看它的工作情况。

  1. 销毁浏览器的所有缓存和 Cookie
  2. xxx.example.comyyy.example.com中,php 文件应该像这样开始。

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

试试这个:

session_start();


$sessionId =  session_id();

登录用户。当用户将切换到其他子域发送的会话 ID 在 URL 中,如此 user.mydomain.example/?id=$sessionId

$sessionId =  $_GET['id'];


session_start($sessionId);

现在用户将获得所有会话值并保持登录状态。

session_start()之前,使用 session_set_cookie_params().domain.example替换为您的域,如下例所示:

session_set_cookie_params(0, '/', '.domain.example');
session_start();