我有一个拥有根域和多个子域的站点,每个子域都是一个单独的yii2模块。目前我必须单独登录每个子域。我希望能够登录到根目录,然后自动登录到每个子域。网上有几页关于实现这一点,但没有任何作用。
目前我在两个main.php配置文件中都有相同的设置(即根域和我正在测试的一个子域)
'components' => [
'request' => [
'enableCookieValidation' => true,
'enableCsrfValidation' => true,
'cookieValidationKey' => 'XXXXXXX',
],
'user' => [
'class' => 'yii\web\User',
'identityClass' => 'common\models\User',
'enableAutoLogin' => true,
'identityCookie' => [
'name' => '_myapp',
'httpOnly' => true,
'path' => '/',
]
],
'session' => [
'name' => 'MYAPPSESSID',
'cookieParams' => [
'path' => '/',
],
],
在使用安装程序登录后在Chrome中检查我的Cookie时,我看到两个Cookie,一个用于主网站,一个用于子域,它们都被称为MYAPPSESSID,并且都包含不同的密钥'这可能与PHP会话中设置的用户信息有关。我知道这两个cookie应该是一个cookie,以便两个域连接到会话用户对象 - 但我已经尝试了所有我能想到的不同设置,并且无法使其工作。
答案 0 :(得分:8)
要能够登录所有子域,请使用以下配置:
'components' => [
'session' => [
// ...
'cookieParams' => [
'path' => '/',
'domain' => ".domain.com",
],
],
'user' => [
// ...
'identityCookie' => [
'name' => '_identity',
'path' => '/',
'domain' => ".domain.com",
],
],
'request' => [
// ...
'csrfCookie' => [
'name' => '_csrf',
'path' => '/',
'domain' => ".domain.com",
],
],
],
答案 1 :(得分:2)
我最终想到了这一点。 session-> cookieParams需要一个'域'在main.php配置文件上设置,这是一个前缀为'。'的顶级域名。我确实试过这个,但是没有生成cookie,结果是因为我在Mamp Pro中设置的本地域没有以cookie预期的方式格式化。所以我的应用是 http://myapp , http://subdomain.myapp 。事实证明,cookie域设置需要顶级域名(如.com)。所以我将主机更改为 http://myapp.local 和 http://subdomain.myapp.local 。然后我将cookie域设置为 .myapp.local 并且它有效。
这是我的新配置,它位于根域和子域中。上面的用户 - > identityCookie设置证明是不必要的。
'components' => [
'request' => [
'enableCookieValidation' => true,
'enableCsrfValidation' => true,
'cookieValidationKey' => 'XXXXXXX',
],
'user' => [
'class' => 'yii\web\User',
'identityClass' => 'common\models\User',
'enableAutoLogin' => true
],
'session' => [
'name' => 'MYAPPSESSID',
'cookieParams' => [
'path' => '/',
'domain' => '.myapp.local'
],
],