3

我有一个有趣的案例。我正在为 Rails 2.3 应用程序开发白标签功能,并且在设置动态会话域时遇到问题。

因此,每个白标都应该有自己的域:company1.com、company2.com、company3.com。更重要的是,他们每个人都应该支持子域并在它们之间共享会话。

即 test1.company1.com, test2.company1.com, company1.com <= 应该共享一个公共会话;test1.example.com, example.com <= 应该共享一个公共会话,但与 company1.com 不同。

在常见情况下(对于单个基域),它是这样完成的:

file:production.rb
config.action_controller.session[:domain] = '.company1.com'

如果我想支持多个域,我必须根据访问的站点域动态设置此配置选项。我目前正在尝试以这种方式完成它:

file:environment.rb
require 'dispatcher'
module ActionController
  class Dispatcher
    def set_session_domain
      tld_size = SubdomainFu.tld_size+1
      host_name = @env['HTTP_HOST'].split('.')[-tld_size,tld_size].join('.')
      ActionController::Base.session = { :domain => ".#{host_name}" }
    end
    before_dispatch :set_session_domain
  end
end

但是上面的代码不起作用。

您是否成功地完成了类似的事情,或者您知道问题/解决方案可能出在哪里?

提前感谢您的时间

4

1 回答 1

2

使用 ActionController::Base.session 是行不通的,因为它仅在初始化处理会话的机架中间件时使用,因此仅在启动您的应用程序时使用。为了使上述代码正常工作,您应该使用

@env['rack.session.options']

看看这里的例子:

http://railsforum.com/viewtopic.php?id=41306

于 2011-07-14T12:32:12.290 回答