跨子域的 PHP 会话

2022-08-30 07:46:59

我正在尝试设置以下内容:

auth.example.com
sub1.example.com
sub2.example.com

如果用户访问或他们没有登录,他们将被重定向到并可以登录。sub1.example.comsub2.example.comauth.example.com

sub1.example.com并且是两个独立的应用程序,但使用相同的凭据。sub2.example.com

我尝试在我的php中设置以下内容.ini:

session.cookie_domain = ".example.com"

但它似乎没有将信息从一个域传递到另一个域。

[编辑]

我尝试了以下方法:

sub1.example.com/test.php

session_set_cookie_params(0, '/', '.example.com');
session_start();
print session_id() . "<br>";
$_SESSION['Regsitered'] = 1;
echo '<a href="http://auth.example.com/test.php">Change Sites</a>'

auth.example.com/test.php

session_set_cookie_params(0, '/', '.example.com');
session_start();
print session_id() . "<br>";
$_SESSION['Checked'] = 1;
print_r($_SESSION);

会话 ID 完全相同,但是当我转储变量时,它不会同时显示两个键,而只是我在每个域下设置的任何键。$_SESSION


答案 1

我不知道问题是否仍然存在,但我只是遇到了同样的问题,并在调用之前设置了会话名称:session_set_cookie_params()

$some_name = session_name("some_name");
session_set_cookie_params(0, '/', '.example.com');
session_start();

我没有改变任何东西,但现在一切都很好。php.ini


答案 2

尽管Cookie被正确设置,但有一件事可以神秘地阻止会话数据在子域上被读取,那就是PHP Suhosin补丁。您可以按照问题中的示例正确配置所有内容,但它可能不起作用。.example.com

关闭以下 Suhosin 会话设置,即可恢复营业:

suhosin.session.cryptua = Off 
suhosin.session.cryptdocroot = Off

推荐