12

我正在使用 Cakephp,但在跨子域维护会话时遇到问题。我的问题如下:

  • 用户登录 'localhost/login'
  • 如果经过身份验证,它们将被重定向到“customer.localhost/home”。

目前,Cake 正在为每个域(即 localhost 和 customer.localhost)创建一个 cookie。这意味着我不能让会话为用户工作。有没有办法将所有 cookie 域固定到父域,以保持会话跨子域工作?

我试过在我的引导程序中输入它,但它没有效果:ini_set('session.cookie_domain', '.localhost');

如果您认为这无法完成,请随时告诉我,以便我可以继续解决这个令人沮丧的问题。

非常感谢,

kSeudo

4

2 回答 2

18

会话(CakePHP 2.x):

要使会话 cookie 对您的所有子域和顶级域有效,您实际上需要在APP/config/bootstrap.php文件中自行设置:

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

然后,在您的APP/config/core.php文件中,将 Security 设置为低:

Configure::write('Security.level', 'low');

“否则,referer_check 将设置为 CakeSession 对象第 441 行中的当前 HTTP_HOST。”

会话(CakePHP 3.x)

会话 cookie 路径默认为应用程序的基本路径。要更改这一点,您可以使用 session.cookie_path ini 值。例如,如果您希望会话在所有子域中持续存在,您可以执行以下操作:

Configure::write('Session', [
    'defaults' => 'php',
    'ini' => [
        'session.cookie_path' => '/',
        'session.cookie_domain' => '.yourdomain.com'
    ]
]);


饼干(CakePHP 2.x):

此页面上,它解释了您可以使用“域”变量:

允许访问 cookie 的域名。例如,使用“.yourdomain.com”允许从您的所有子域进行访问。

根据他们的示例代码:

<?php
public $components = array('Cookie');
public function beforeFilter() {
    parent::beforeFilter();
    $this->Cookie->name = 'baker_id';
    $this->Cookie->time =  3600;  // or '1 hour'
    $this->Cookie->path = '/bakers/preferences/';
    $this->Cookie->domain = 'example.com';
    $this->Cookie->secure = true;  // i.e. only sent if using secure HTTPS
    $this->Cookie->key = 'qSI232qs*&sXOw!';
    $this->Cookie->httpOnly = true;
}

饼干(CakePHP 3.x):

在这里阅读

cookie 可用的域。要使 cookie 在 example.com 的所有子域上可用,请将 domain 设置为“.example.com”。

于 2012-05-09T17:23:44.757 回答
1

app/Config/core.php 中有一个配置来更改会话 cookie 域:

Configure::write('Session', array(
    'defaults' => 'php',
    'ini' => array(
        'cookie_domain' => '.example.com'
    )
));
于 2013-12-13T21:43:39.883 回答