我对所有用户数据使用 PHP 会话(不是 cookie,除了 session id cookie) ,当用户访问他们的配置文件 user.mydomain.example时,他们会立即“注销”,直到删除子域。
user.mydomain.example
是否有一种方法可以接受来自所有域的会话,只要它的 *.mydomain.example
*.mydomain.example
这里有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');
让安全见鬼去吧,如果你像我一样对不完整或糟糕的答案感到沮丧,这就是你的救世主。就是这样。
这是一个很好的解决方案,但是您不能在所有情况下都使用它。例如,当您不能依赖于非会话 cookie 时,它将无法工作。
这实际上必须工作,如果你正确使用它。
例如,您需要将它放在 session_start()之前,还需要放在所有调用 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 来查看它的工作情况。
ini_set
在 xxx.example.com和 yyy.example.com中,php 文件应该像这样开始。
xxx.example.com
yyy.example.com
ini_set('session.cookie_domain', '.example.com' ); session_start();
试试这个:
session_start(); $sessionId = session_id();
登录用户。当用户将切换到其他子域发送的会话 ID 在 URL 中,如此 user.mydomain.example/?id=$sessionId
user.mydomain.example/?id=$sessionId
$sessionId = $_GET['id']; session_start($sessionId);
现在用户将获得所有会话值并保持登录状态。
在 session_start()之前,使用 session_set_cookie_params()将 .domain.example替换为您的域,如下例所示:
session_set_cookie_params()
.domain.example
session_set_cookie_params(0, '/', '.domain.example'); session_start();