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

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

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

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

提前致谢

【问题讨论】:

    标签: cakephp session php


    【解决方案1】:

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

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

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

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

    <?php ini_set('session.cookie_domain', '.example.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 核心代码,看看它是如何工作的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-19
        • 2012-11-17
        • 2011-09-21
        • 2011-03-01
        • 1970-01-01
        • 2013-08-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多