我有一个使用子域的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未在本地设置的任何线索?谢谢!
答案 0 :(得分:3)
在Rails 3.0.3中设置:domain => :all
时,除非您在浏览器中指定顶级域,否则似乎不会设置本地会话cookie。这可能是设计的,但我看不出任何文件。
因此,当您访问localhost时,您的会话将失败,但应该在mylaptop.local中正常设置。 “.local”似乎满足TLD的要求。
答案 1 :(得分:2)
在以:domain => :all
或IP地址访问网站时,Rails中存在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