我有一个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身份验证登录;它确实验证了我,但是一旦我被重定向,就会要求我再次登录。
正如我所说,我使用restful_authentication,我也使用乘客2.1.2。 有人可以帮忙吗?
答案 0 :(得分: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'
答案 1 :(得分:3)
在Rails 2.3中你应该使用
config.action_controller.session[:domain] = '.example.com'
答案 2 :(得分:2)
更加防弹的解决方案是检查会话是否已存在。如果你盲目地替换整个会话对象,它可能会在将来绊倒你。
if ActionController::Base.session
ActionController::Base.session[:domain] = '.example.com'
else
ActionController::Base.session = { :domain => '.example.com' }
end
我喜欢在初始化文件中执行此操作。
答案 3 :(得分:1)
您必须注明:
.example.com
(请注意前导点),以便会话Cookie 适用于example.com 及其子域 。
答案 4 :(得分:1)
只是想提一下处理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
答案 5 :(得分:1)
我正在运行Rails 2.3.5并且
config.action_controller.session = {:domain => '.localhost:3000'}
在我的development.rb中,但是我没有让它工作?
你需要做的其他事情吗?
答案 6 :(得分:0)
我们遇到了同样的问题(丢失会话,没有子域名),nginx + thin。迁移到apache + passenger(最新版本)修复了问题。
答案 7 :(得分:0)
我也在运行2.3.5并遇到类似问题@ alfred-nerstu
没有来自@schickm的补丁的错误消息,但似乎也没有。
答案 8 :(得分:0)
可以将其添加到您设置会话密钥和密码
的相同位置config.action_controller.session = {
:key => '_app_session',
:domain => '.domain.com',
:secret => 'secret'
}
答案 9 :(得分:-1)
基于cookie的会话我遇到了同样的问题。升级到Passenger 2.1.3似乎解决了这个问题。