为一个Rails应用程序使用多个域名时保留会话

时间:2009-01-27 18:29:29

标签: ruby-on-rails ruby session

我有一个Rails 2.2.2应用程序,我想与多个客户端“共享”。每个客户端都有自己的域名和数据库。目的是允许一个Rails应用程序“托管”许多网站。

我使用Apache作为mongrel集群的前端,作为Web服务器。为了使Rails知道哪个客户端的请求,Apache为每个请求添加了“client_id”标头。 Rails使用这个'client_id'来选择正确的数据库。

只要我一次只能从一个域名访问它,这个效果非常好。说'example1.com'。

当许多用户同时从多个域名访问应用程序时,它甚至可以正常工作。

我遇到的一个问题是,当两个用户同时从两个域名访问该应用程序时, cookie会以意外方式重置

问题在下面的日志片段中说明:

第一个请求来自用户1登录到example1.com。

第二个请求来自用户2,对于example2.com主页。

第3个请求来自用户1,用于应用程序中的另一个页面。据推测,该请求包括原始cookie。 问题是,为什么Rails会发回不同的cookie?

请注意,与其他几个问题不同,我不会尝试跨多个域共享相同的Cookie。上述示例中的用户1和用户2正在访问不同的域。

- 约翰

**1st Request from USER 1 for example1.com**
    Processing Admin::CmsController#index (for 75.127.142.66 at 2009-01-27 13:15:27) [GET]
      Session ID: 00b9cfb6fd397e5c9934ea58eaef648d
    >>> Request for client 90873721, EXAMPLE1.COM
    Rendering template within layouts/admin/standard
    Rendering admin/cms/list
    Completed in 114ms (View: 14, DB: 81) | 200 OK [https://example1.com/admin/cms]

**2nd Request from User 2 for example2.com**    
    Processing CmsController#cms_show (for 64.1.215.163 at 2009-01-27 13:16:15) [GET]
      Session ID: 4fed1c59001f7484a63fb6280376825a
      Parameters: {"alias"=>"home.html"}
    >>> Request for client 48218343, EXAMPLE2.COM
    ### alias: home.html
    Rendering template within layouts/two-column
    Rendering cms/cms_show
    Completed in 23ms (View: 13, DB: 3) | 200 OK [http://example2.com/]

**3rd Request from User 1 for example1.com -- note session ID changes!!!**    
    Processing Admin::CmsController#index (for 75.127.142.66 at 2009-01-27 13:16:18) [GET]
      Session ID: 85c178aa70ed2bef6a767e844bf6c6d6
    >>> Request for client 90873721, EXAMPLE1.COM
    ####### 'admin/cms', 'index'
    Redirected to actionsignincontroller/admin/user
    Filter chain halted as [:check_authentication] rendered_or_redirected.
    Completed in 4ms | 302 Found [https://example1.com/admin/cms]

**4th request -- redirected from 3rd request**    
    Processing Admin::UserController#signin (for 75.127.142.66 at 2009-01-27 13:16:18) [GET]
      Session ID: 85c178aa70ed2bef6a767e844bf6c6d6
    >>> Request for client 90873721, EXAMPLE1.COM
    Rendering template within layouts/admin/standard
    Rendering admin/user/signin
    Completed in 10ms (View: 6, DB: 0) | 200 OK [https://example1.com/admin/user/signin]

3 个答案:

答案 0 :(得分:1)

好吧,我通过删除共享的mongrel_cluster来解决了这个问题,并为每个域提供了自己的mongrel实例。

我希望通过共享一个mongrel集群来节省一些服务器资源,但为此,我需要弄清楚如何解决这个cookie问题。

顺便说一句,我在“Advanced Rails Recipes”食谱83中找到了部分解决方案,“给用户自己的子域名”。该配方还解释了如何为用户提供他们自己的域名,但它使用的方法与我尝试的方法不同。

答案 1 :(得分:0)

Cookie是域依赖的,因此您应该使用不同的技术 - 发出cookie /创建会话的单个服务器。查看 Cross Domain User Tracking

答案 2 :(得分:0)

我不是想在不同的域中跟踪用户。实际上,如果一个用户打开了两个浏览器,并且同时使用两个域,那么他有两个不同的会话cookie,每个域一个。