1

导轨 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 和我放的东西。我做重定向。在过滤器再次触发之前,根域上发生了新请求,问题是:会话未初始化

4

1 回答 1

1

这应该可以在两者之间正常工作我在我的开发人员上设置了以下内容

应用程序位于 example.dev

我在 a.example.dev 查看并设置了一个会话变量,然后访问 b.example.dev 并且只要(如您所描述的)您将域设置为会话存储的“example.dev”,它就会被设置

我的根控制器/操作中的这段代码完全符合您的描述

unless request.subdomain.to_s == 'another'
  session[:original_domain] = request.subdomain.to_s
  redirect_to 'http://another.' + request.domain.to_s  
end

并且在会话中可以查看 original_domain

如果您将示例代码放入我可以查看任何陷阱

于 2013-07-11T17:47:30.747 回答