【发布时间】:2018-10-31 14:36:30
【问题描述】:
这是我的情况,我有一个 Rails 4 应用程序可以被多个域访问,根据域,内容会发生变化。
假设主域是domain1,而所有其他域只是使用 Nginx 的proxy_pass 将请求转发到domain1,这一切正常,除了当用户登录domain2 时,rails 设置domain1 的会话,因此 domain2 中的用户保持注销状态,因为未为 domain2 设置会话。
我知道 cookie 不能在不同的域之间共享,但由于处理所有这些域的是同一个应用程序,所以肯定有可能。
有什么想法吗?
更新
这是我所在的位置:
- 我向代理通道添加了一个自定义标头,其中包含访问应用程序的域。
- 我编写了一个中间件来检查此标头并将
rack.session.options domain设置为自定义标头中指定的域。 - 我在
development.rb和production.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:3000或127.0.0.1:3000访问rails应用是不是一样的问题?我没有任何解决方案,但问题很有趣 -
是的,本质上我相信这是同一个问题
标签: ruby-on-rails session nginx