我已经看到很多关于这个主题的问题,但其中很多都有相互矛盾的信息,并且由于某种原因它对我不起作用。
我有:
顶级域:即 lvh.me(开发)。每个用户都有子域:即 userdomain.lvh.me 登录表单在顶级域中:lvh.me
我想:
- 如果用户登录,则需要在所有子域之间共享会话。我的意思是,会话需要在 lvh.me:3000/something 和 userdomain.lvh.me:3000 中处于活动状态
- 如果用户从 lvh.me:3000/something 注销它应该可以工作,如果用户从 userdomain.lvh.me:3000 注销它也应该可以工作。
我试过
在初始化程序中设置以下内容:
MyApplication::Application.config.session_store :cookie_store, :key => '_mykey', :domain => :all
发生了什么?
我可以登录 lvh.me:3000,我被正确地重定向到 lvh.me:3000/internalpage,如果我去 subdomain.lvh.me:3000 效果很好。我也可以从 lvh.me:3000/internalpage 注销,但是如果我尝试从 subdomain.lvh.me:3000 注销它不起作用。Devise SessionsController 中的destroy 动作被执行,一切都被执行,但会话并没有终止。
根据http://excid3.com/blog/sharing-a-devise-user-session-across-subdomains-with-rails-3/,
这里的诀窍是 :domain 选项。它的作用是设置 TLD(顶级域)的级别并告诉 Rails 域的长度。您要在这里注意的部分是,如果您设置 :domain => :all like 在某些地方是推荐的,除非您使用 localhost,否则它根本不起作用。:all 默认的 TLD 长度为 1,这意味着如果您使用 Pow (myapp.dev) 进行测试,它也不会工作,因为这是长度为 2 的 TLD。
所以,读完之后我也试过了
MyApplication::Application.config.session_store :cookie_store, :key => '_mykey', :domain => 'lvh.me'
发生了什么? 我可以登录 lvh.me:3000,我被正确重定向到 lvh.me:3000/internalpage,如果我去 subdomain.lvh.me:3000 它不起作用,我在那里没有会话。如果我回到 lvh.me:3000/internalpage 我的会话就消失了。那里发生什么了?
还有什么?
然后,在阅读rails 3.2 subdomains 并设计之后,我将初始化程序行更改为
MyApplication::Application.config.session_store :cookie_store, :key => '_mykey', :domain => '.lvh.me'
注意“。” 在域名之前。根据SO中的帖子:
这允许跨子域访问此 cookie,并且应用程序应跨子域维护它的会话。可能不是 100% 您正在寻找的东西,但它应该让您朝着正确的方向前进。
发生了什么? 没什么,没用。如果与我尝试的最后一件事相比,行为相同。
我终于尝试了 Rails 3 session_store domain :all 真的做什么? ,创建一个自定义类来处理 cookie。但我没有运气。
当然,我在每次尝试之前都删除了所有 cookie 和临时文件。我还更改了 cookie 的名称。有什么帮助吗?谢谢!