5

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

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

这就是我在 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身份验证登录;它确实对我进行了身份验证,但是一旦我被重定向,它就会要求我再次登录。

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

4

10 回答 10

7

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'
于 2009-06-11T00:06:10.823 回答
3

在 Rails 2.3 中,您应该使用

config.action_controller.session[:domain] = '.example.com'
于 2009-05-20T13:03:36.210 回答
2

A more bullet proof solution would be to check if the session already exists or not. If you are blindly replacing the whole session object it may trip you up in the future.

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

I like to do this in an initializer file.

于 2010-04-25T19:01:57.163 回答
1

您必须表明:

.example.com

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

于 2009-03-25T21:07:10.747 回答
1

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

在环境中像这样的东西.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
于 2009-12-14T17:33:49.287 回答
1

我正在运行 Rails 2.3.5 并且有

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

在我的 development.rb 中,但我没有让它工作?

你还需要做什么?

于 2010-03-13T01:08:53.883 回答
0

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

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

于 2010-12-23T17:20:14.797 回答
0

我们遇到了同样的问题(丢失会话,没有子域),使用 nginx + Thin。迁移到 apache + 乘客(最新版本)解决了这个问题。

于 2009-04-20T20:32:15.620 回答
0

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

config.action_controller.session = {
      :key => '_app_session',
      :domain => '.domain.com',
      :secret => 'secret'
}
于 2012-10-11T07:34:58.977 回答
-1

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

于 2009-04-08T12:05:13.847 回答