English 中文(简体)
在使用多个域名作为一个Rails应用时保留会话
原标题:
  • 时间:2009-01-27 18:29:28
  •  标签:

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

我正在使用 Apache 作为前端,并将其作为 Web 服务器来使用 Mongrel 集群。为了使 Rails 知道请求属于哪个客户端,Apache 在每个请求中添加了一个 client_id 标头。Rails 使用此 client_id 来选择正确的数据库。

只要我一次只从一个域名访问,这个工作就能完美地运行。比如说 example1.com。

当多个用户同时从多个域名访问应用程序时,它甚至可以正常工作 - 大多数情况下。

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

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

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

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

第三个请求来自用户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]
最佳回答

嗯,我通过消除共享的猛犸群集,并为每个域提供自己的猛犸实例来解决了这个问题。 (Mm, wǒ tōngguò xiāomiè gòngjí, bìng wèi měi gè yù tígōng zìjǐ de měngmǎ shílì lái jiějué le zhège wèntí.)

我希望通过共享单个Mongrel集群来节省一些服务器资源,但为了这样做,我需要找出如何解决这个Cookie问题。

顺便一提,我在《高级 Rails 菜谱》食谱 83 中找到了部分解决方案,“为用户提供自己的子域名”。该食谱还解释了如何为用户提供自己的域名,但它使用了与我尝试的不同方法。

问题回答

Cookies are domain-dependent, so you should use a different technique - a single server issuing cookies/creating sessions. Check out Cross Domain User Tracking

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





相关问题
热门标签