【问题标题】:Rails 3, no local session cookie with :domain => :allRails 3,没有本地会话cookie :domain => :all
【发布时间】:2011-05-11 08:24:28
【问题描述】:

我有一个使用子域的 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 与 rails server 和乘客独立)。我也试过在 80 端口而不是 3000 端口上本地运行,但这也没什么区别。

关于会话 cookie 未在本地设置的任何线索?谢谢!

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 看我的回答。我有'lhs.com',但这也不起作用。您指的是 TLD-Size,默认为 2 (domain.ext),但对于开发,您可以将其设置为 1
    【解决方案3】:

    Rails 中存在一个错误,当以localhost 或 IP 地址访问该站点时,:domain => :all 被破坏:

    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)。

    【讨论】:

      【解决方案4】:

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

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

      确保在主机名前包含.

      【讨论】:

      • 为什么所有键都以'_'开头
      • 想知道我如何让它在不同的端口上工作。我有两个部分(部署到不同的子域)在不同的端口上运行用于开发
      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-07-10
        • 2011-07-23
        • 2011-04-29
        • 2013-04-28
        • 2015-01-23
        • 2011-04-11
        • 1970-01-01
        • 2016-07-02
        • 2011-04-10
        相关资源
        最近更新 更多