Rails 3,没有本地会话cookie:domain => :所有

时间:2010-11-17 10:34:07

标签: cookies ruby-on-rails-3 heroku

我有一个使用子域的Rails3应用。要允许登录等在所有子域中工作,请在config/initializers/session_store.rb

中执行此操作
MyApp::Application.config.session_store :cookie_store, :key => '_myapp_session', :domain => :all

当我将我的应用程序部署到Heroku时,这非常有效。我可以登录并保持登录子域名。

但是,在本地开发时,工作。

我的浏览器确实正确设置了会话cookie:

$ curl http://test.lhs.com/users/sign_in
...
Set-Cookie: _myapp_session=BAh...3ed; domain=.lhs.com; path=/; HttpOnly
...

但是,我的浏览器(我尝试过Safari,FireFox和Chrome)没有设置此Cookie。因此,当我登录时,我收到InvalidAuthenticityToken错误。

我已尝试删除:domain => :all部分,该部分会正确设置会话Cookie,但仅适用于当前子域。像:domain => '.lhs.com'这样明确地设置它也会设置cookie。

我在这里不知所措。为什么这在heroku上生产,而不是在本地生产。我甚至尝试过不同的服务器(Webrick with rails server和passenger-standalone)。我也尝试在端口80上本地运行而不是3000,但这也没有区别。

为什么会话cookie未在本地设置的任何线索?谢谢!

5 个答案:

答案 0 :(得分:3)

在Rails 3.0.3中设置:domain => :all时,除非您在浏览器中指定顶级域,否则似乎不会设置本地会话cookie。这可能是设计的,但我看不出任何文件。

因此,当您访问localhost时,您的会话将失败,但应该在mylaptop.local中正常设置。 “.local”似乎满足TLD的要求。

答案 1 :(得分:2)

在以:domain => :all或IP地址访问网站时,Rails中存在localhost被破坏的错误:

https://rails.lighthouseapp.com/projects/8994/tickets/6002-patch-ignore-domain-all-option-if-host-is-ip-address-or-localhost

看起来已经提交了一个补丁,但我无法从该页面看出它是否已包含在任何版本中。

正如您所发现的,解决方案是编辑/ etc / hosts以包含localhost.localdomain之类的内容或除了裸主机名之外的其他内容(如lhs.me)。

答案 2 :(得分:1)

我不确定这里的问题是什么,但我已将'lhs.com'更改为'lhs.me'并将其移至我的hosts文件中的官方 localhost定义下方。并非一切都像魅力一样。

答案 3 :(得分:1)

在config / intializers / session_store.rb中,将您的域设置为使用所有子域

Your::Application.config.session_store :cookie_store, 
                                       :key => '_example.com_session',  
                                       :domain => ".lvh.me"

确保在主机名前包含.

答案 4 :(得分:0)

仅在生产中使用自定义会话存储配置

if Rails.env.production?
    Rails::Application.config.session_store(:cookie_store, key: '_my_session', secure: Rails.env.production?, domain: :all, tld_length: 2)
end