使用子域在rails 2.3.2 app中丢失会话

我有一个2.2.3应用程序,我升级到2.3.2

它是一个多站点(使用子域),可为所有站点创建一个顶级会话。

这是我在production.rb中更改域的方式:

ActionController::Base.session_options[:domain] = "example.com" # in rails 2.2.2, this is what i used to do: # ActionController::Base.session_options[:session_domain] = "example.com" 

升级后,奇怪的事情开始发生我无法再使用restful身份validation登录了。 它确实对我进行了身份validation,但是一旦我被重定向,就会要求我再次登录。

正如我所说,我使用restful_authentication,我也使用乘客2.1.2。 有人可以帮忙吗?

Olly的回答是正确的,在rails 2.3中它应该是:

 config.action_controller.session[:domain] = '.example.com' 

我只是想补充一点,如果你还没有创建一些会话选项,你可能会在使用它时收到:

 undefined method `[]=' for nil:NilClass 

在这种情况下,您应该使用它(它创建会话变量而不是更新它):

 config.action_controller.session ||= {} config.action_controller.session[:domain] = '.example.com' 

编辑:显然Rails 2.2.2项目使用不同的东西。 “domain”应命名为“session_domain”,并将句点字符放在域前面。 试试这个:

 config.action_controller.session ||= {} config.action_controller.session[:session_domain] = 'example.com' 

在Rails 2.3中你应该使用

 config.action_controller.session[:domain] = '.example.com' 

更加防弹的解决方案是检查会话是否已存在。 如果你盲目地替换整个会话对象,它可能会在将来绊倒你。

 if ActionController::Base.session ActionController::Base.session[:domain] = '.example.com' else ActionController::Base.session = { :domain => '.example.com' } end 

我喜欢在初始化文件中执行此操作。

只是想提一下处理cookie的整个子域事物的另一种方法是动态的。 适用于2.3.4。

在environment.rb中有这样的东西

 # solution to use the cookies in the api. domains # this is relevant but in 2.3.4 the code is different # http://szeryf.wordpress.com/2008/01/21/cookie-handling-in-multi-domain-applications-in-ruby-on-rails/ # Just making sure that api. shares the domain name require 'dispatcher' module ActionController class Dispatcher def set_session_domain host_name = @env['SERVER_NAME'] new_host_name = whatever #some mod of the host_name, for instance ActionController::Base.session = { :domain => new_host_name } end before_dispatch :set_session_domain end end 

我正在运行Rails 2.3.5并且有

 config.action_controller.session = {:domain => '.localhost:3000'} 

在我的development.rb但我不能让它工作?

还有什么需要做的吗?

你必须表明:

 .example.com 

(注意前导点 ),以便会话cookie 应用于example.com 及其子域

我们遇到了同样的问题(丢失会话,没有子域名),nginx + thin。 迁移到apache + passenger(最新版本)修复了问题。

我也运行2.3.5并遇到类似的问题@ alfred-nerstu

没有来自@schickm的补丁的错误消息,但它似乎也没有。

它可以添加到您设置会话密钥和密钥的相同位置

 config.action_controller.session = { :key => '_app_session', :domain => '.domain.com', :secret => 'secret' } 

基于cookie的会话我遇到了同样的问题。 升级到Passenger 2.1.3似乎解决了这个问题。