Nginx + 1个Rails应用程序+多个域+ 1个会话

时间:2018-10-31 14:36:30

标签: ruby-on-rails session nginx

在这种情况下,我有一个Rails 4应用,该应用可以被多个域访问,具体取决于域,内容会发生变化。

假设主域是domain1,而所有其他域仅使用Nginx的proxy_pass将请求转发到domain1,除了用户登录{ {1}},rails为domain2设置了会话,因此domain1中的用户由于未为domain2设置会话而保持注销状态。

我了解无法在不同的域之间共享cookie,但是由于它是处理所有这些域的同一应用程序,因此肯定可以实现。

有什么想法吗?

更新

我在这里:

  • 我在代理传递中添加了一个自定义标头,其中包含从中访问应用程序的域。
  • 我编写了一个中间件,用于检查此标头并将domain2设置为自定义标头中指定的域。
  • 我已在rack.session.options domaindevelopment.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

必须有一种方法,任何输入都值得赞赏!

1 个答案:

答案 0 :(得分:1)

最终解决了这个问题,我所有的Rails东西都很好,问题出在Nginx配置中,更具体地说,主域使用SSL,而其他域则没有,所以我猜Nginx出于安全原因未设置cookie。