在这种情况下,我有一个Rails 4应用,该应用可以被多个域访问,具体取决于域,内容会发生变化。
假设主域是domain1
,而所有其他域仅使用Nginx的proxy_pass
将请求转发到domain1
,除了用户登录{ {1}},rails为domain2
设置了会话,因此domain1
中的用户由于未为domain2
设置会话而保持注销状态。
我了解无法在不同的域之间共享cookie,但是由于它是处理所有这些域的同一应用程序,因此肯定可以实现。
有什么想法吗?
更新
我在这里:
domain2
设置为自定义标头中指定的域。rack.session.options domain
和development.rb
文件中启用了中间件。 production.rb
添加到:domain => :all
选项中。session_store
已正确设置为session.options[:domain]
。但是我无法通过domain2
设置会话,我在这里错过了什么?
代码
中间件
domain2
config / initializers / session_store.rb
class ProxyPassCookie
def initialize app
@app = app
end
def call env
host = env["HTTP_HOST"].split(':').first
#rack attaches HTTP_ to all headers
dom = env["HTTP_WLDOMAIN"].blank? ? host : env["HTTP_WLDOMAIN"]
env["rack.session.options"][:domain] = ".#{dom}"
@app.call(env)
end
end
config / environments / development.rb | production.rb
Rails.application.config.session_store :cookie_store, key: '_myapp_session', :domain => :all
必须有一种方法,任何输入都值得赞赏!
答案 0 :(得分:1)
最终解决了这个问题,我所有的Rails东西都很好,问题出在Nginx配置中,更具体地说,主域使用SSL,而其他域则没有,所以我猜Nginx出于安全原因未设置cookie。