在CakePHP中完成的网站上维护两个不同域之间的会话时出现问题

时间:2009-08-18 09:44:56

标签: cakephp session php

正如我之前发布的那样......我用两种语言创建了一个网站。一个网址为www.mainDomain.com(英文),另一个网址为www.fr.subDomain.com(法文)。

两者都在CakePHP中完成,用法语我刚刚将其视图更改为法语。但问题是,当任何人登录英文版本然后切换到法语版本时,会话不会识别它并再次请求登录。它已成为我迄今为止所做的Web应用程序中最大的错误。

为此,正如斯旺尼告诉我通过a link,我在我的应用程序上做了,因为它在链接上说。显然,它适用于登录两个域之间的共享会话(主域和它的子域)。但是当我彻底检查它时,我发现两个站点都在从数据库中抛出最新的新闻,两个数据都不同。只是为了检查我是否错了,我将一些保存变量更改为会话数组中的数据库。但现在它拒绝记住任何事情(会话)。有谁能告诉我这可能有什么问题,我该如何解决这个...... ???

提前致谢

3 个答案:

答案 0 :(得分:3)

我不确定我完全理解,但我会尝试。我认为这是关于一个名为session.cookie_domain的PHP设置。

假设您的网站包含以下网址:

您想要的设置是:.example.org

您可以在php.ini.htaccess文件甚至PHP本身中进行调整:

<?php ini_set('session.cookie_domain', '.example.org'); ?>

如果您的网站在两个完全不同的域上运行,例如:

...然后无法在这两个不同的域之间共享cookie。

答案 1 :(得分:3)

@dooltaz这是一个很好的解决方案。问题是,蛋糕似乎是​​在我之后设置cookie。我所做的是向用户发送一个重定向方法,然后将cookie设置移动到afterFilter

    function afterFilter() {
    if (!empty($this->params['url']['session_key'])) {
        // Setup variables here...
        setcookie(Configure::read('Session.cookie'), $this->params['url']['session_key'], time()+360000, '/');
        // Cakes cookie method will put your cookie name in [] so it does not work.
    }
}

(还修复了代码中的拼写错误..)

答案 2 :(得分:2)

如果您有两个不同的域名,我建议如下:

在“www.mainDomain.com”上,输入指向“www.fr.subDomain.com”网站的链接,并在您的视图文件中传递Cookie:

$session_cookie = $_COOKIE[Configure::read('Session.cookie')];
echo $html->link('See French Site', 'http://www.fr.subDomain.com/?session_key='.$session_cookie);

然后在法国网站上添加一些代码来模仿app_controller.php&gt;中的cookie。 beforeFilter()。

function beforeFilter() {
    if(!empty($this->params['url']['session_key']) {
        // Setup variables here...
        setcookie(Configure::read('Session.cookie'), $session_cookie, time()+360000, '/', $domain);
        // You could use CAKE's setcookie command here.
    }
}

现在cookie匹配,您将不得不使用数据库会话或基于蛋糕文件的会话。阅读core.php中的说明进行设置。

这应该允许您基本上在各个站点上共享相同的会话。我实际上正在通过一次登录在多个站点上实施ACL。它可能会有点棘手,但只是一步一步地做,你会做得很好。另外,不要害怕跳进Cake核心代码,看看它是如何工作的。