导轨 3.2.12,红宝石 1.9.3
我们允许用户使用子域指定他们所在的公司,例如mycompany.example.com
,但我们重定向到规范example.com
并需要记住用户来自mycompany
。
我们已经设置了我们的环境,因此config.session_store
包含:domain => 'example.com
(也可以使用的替代方法是:domain => :all, :tld_length => 2
),这应该可以允许在子域之间共享会话信息。有许多很棒的帖子,例如:在 Rails 中的子域之间共享会话(cookies)?
但是在我发送session.inspect
到日志的重定向之前,它显然得到了一个不同的会话(两个单独的会话 id 等)。所以最基本的问题是,mycompany
在我剥离它之前,我无法使用会话来记住该部分。
我可以解决这个问题,但在许多情况下,同一用户将来自多家公司(其中一部分是我们的支持团队需要能够切换公司)。
我已经在 OS X 上的 Chrome 和 Safari 上尝试过这个。我使用的是“pow”,所以我的本地开发环境有一个类似的域example.dev
,可以帮助排除几个问题(与普通localhost:3000
服务器相比)。
我错过了什么吗?确实可以跨域共享 cookie 吗?
更新:
在定义的 before_filter 中调用的示例代码ApplicationController
:
def redirect_to_canonical_if_needed
logger.debug "Starting before_filter. session contains: #{session}"
if request.host != 'example.com'
session[:original_domain] = "Originally came from #{request.host}"
logger.debug "Redirecting, session contains: #{session}"
redirect_to 'http://example.com', :status => :moved_permanently
end
end
添加到config/environments/production.rb
和删除的设置config/initializers/session_store.rb
config.session_store = { :key => 'example_session', :secret => "secret", :domain => :all, :tld_length => 2 }
或者
config.session_store = { :key => 'example_session', :secret => "secret", :domain => 'example.com' }
和记录结果,如果我从一个不存在会话的新环境开始,转到 url a.example.com:
Starting before_filter, session contains: {}
Redirecting, session contains: {"session_id"=>"4de9b56fb540f7295cd3192cef07ba63", "original_domain"=>"a.example.com"}
Filter chain halted as :redirect_to_canonical_if_needed rendered or redirected
Completed 301 Moved Permanently in 2294ms (ActiveRecord: 855.7ms)
Started GET "/" for 123.456.789.123 at 2013-07-12 09:41:12 -0400
Processing by HomeController#index as HTML
Parameters: {}
Starting before_filter, session contains: {}
因此,在每个新请求上都会触发 before 过滤器。第一次请求没有会话,因此“未加载”消息。需要重定向的测试是真的。我在会话中放了一些东西,它会得到一个 id 和我放的东西。我做重定向。在过滤器再次触发之前,根域上发生了新请求,问题是:会话未初始化