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

Posted

技术标签:

【中文标题】在 CakePHP 中完成的网站上两个不同域之间的会话维护问题【英文标题】:Problem in maintaining session between two different domains on a website done in CakePHP 【发布时间】:2010-11-20 13:03:03 【问题描述】:

正如我之前发布的那样...我已经创建了两种语言的网站。一个带有 URL www.mainDomain.com(英语),另一个带有 www.fr.subDomain.com(法语)。

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

为此,正如 Swanny 告诉我通过 a link 并按照链接上所说的那样在我的应用程序上执行此操作。显然,它适用于在两个域(主域和它的子域)之间共享会话的登录.但是当我仔细检查时,我意识到这两个站点都在从数据库中抛出最新的新闻,两个数据是不同的。只是为了检查我是否错了,我将一些保存变量更改为会话数组中的数据库。但现在它拒绝记住任何东西(会话)。谁能建议我这可能是什么问题,我该如何解决这个问题...???

提前致谢

【问题讨论】:

【参考方案1】:

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

假设您的网站有以下网址:

http://www.example.org/ http://fr.example.org/ http://de.example.org/

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

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

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

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

http://example1.org/ http://example2.org/

...那么这两个不同的域之间就没有办法共享cookie了。

【讨论】:

我正在使用 ubuntu 和 zend 框架。我应该在哪里写上面的代码?谢谢 如果你有 example.org 和 sub.example.com 怎么办。这可能吗? @Dobler 不同的域?不,你需要一个桥梁——比如某种重定向来完成这项工作。或者您使用 javascript(例如 jsonp)通过跨域请求在客户端拉入登录状态。【参考方案2】:

@dooltaz 这是一个很好的解决方案。问题是蛋糕似乎在我之后设置饼干。我所做的是向用户发送重定向方法,然后将 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.
    

(还修正了代码中的错字..)

【讨论】:

【参考方案3】:

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

在“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 中的 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 核心代码,看看它是如何工作的。

【讨论】:

以上是关于在 CakePHP 中完成的网站上两个不同域之间的会话维护问题的主要内容,如果未能解决你的问题,请参考以下文章

同一网站空间上的两个域,但通过 htaccess 和 GET 参数具有不同的内容/语言

在 CakePHP 上使用域作为“前缀”

模拟两个域之间的用户

CakePHP2 与 CakePHP3 在同一个域上共存

如何使用 cakephp 3 在不同数据库中的模型之间进行关联?

在同一域的两个网站之间共享 cookie