【问题标题】:Nginx + 1 Rails app + Multiple Domains + 1 sessionNginx + 1 Rails 应用程序 + 多个域 + 1 个会话
【发布时间】:2018-10-31 14:36:30
【问题描述】:

这是我的情况,我有一个 Rails 4 应用程序可以被多个域访问,根据域,内容会发生变化。

假设主域是domain1,而所有其他域只是使用 Nginx 的proxy_pass 将请求转发到domain1,这一切正常,除了当用户登录domain2 时,rails 设置domain1 的会话,因此 domain2 中的用户保持注销状态,因为未为 domain2 设置会话。

我知道 cookie 不能在不同的域之间共享,但由于处理所有这些域的是同一个应用程序,所以肯定有可能。

有什么想法吗?

更新

这是我所在的位置:

  • 我向代理通道添加了一个自定义标头,其中包含访问应用程序的域。
  • 我编写了一个中间件来检查此标头并将rack.session.options domain 设置为自定义标头中指定的域。
  • 我在development.rbproduction.rb 文件中启用了中间件。
  • 我已将:domain => :all 添加到session_store 选项中。
  • 在我检查过的控制器中,session.options[:domain] 正确设置为domain2

但我无法从domain2 设置会话,我在这里缺少什么?

代码

中间件

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/initializers/session_store.rb

Rails.application.config.session_store :cookie_store, key: '_myapp_session', :domain => :all

配置/环境/development.rb |生产.rb

config.middleware.use "ProxyPassCookie"

一定有办法做到这一点,任何意见表示赞赏!

【问题讨论】:

  • 和通过localhost:3000127.0.0.1:3000访问rails应用是不是一样的问题?我没有任何解决方案,但问题很有趣
  • 是的,本质上我相信这是同一个问题

标签: ruby-on-rails session nginx


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2016-01-19
    • 2016-07-10
    • 2012-12-31
    • 2010-10-03
    • 2011-01-16
    • 2010-10-22
    • 1970-01-01
    • 2016-12-26
    • 2017-01-10
    相关资源
    最近更新 更多