【问题标题】:Rails: activating SSL support gets Chrome confusedRails:激活 SSL 支持让 Chrome 感到困惑
【发布时间】:2012-05-04 07:45:47
【问题描述】:

Rails 应用有一个不错的配置选项:

config.force_ssl = true

但是,似乎只是将其设置为 true 并不能使 HTTPS 连接正常工作。更重要的是 - 在尝试(但失败)使用 Chrome 连接到 https://localhost:3000 之后,我已将此选项设置为 false,即使我编写 http,Chrome 仍会尝试打开 https。

所以,有几个问题:

--如何强制Chrome不再尝试https? --在我的 Rails 应用上启用 SSL 的正确方法是什么?

更新:该应用程序在 Heroku 上运行,并且似乎在那里自动支持 https。我也可以在本地测试 SSL 吗?比如在运行 rails server 的时候?

【问题讨论】:

  • 您使用哪个网络服务器>? Rails 是中间件!该服务器是如何配置的?
  • 您的服务器是否在某个时间点设置了 Strict Transport Security 标头(Chrome 会记住的)?

标签: ruby-on-rails ssl https


【解决方案1】:

首先,我应该说我没有尝试过,但是Chrome仍然使用HTTPS主要有两个可能的原因:

  • 使用 HTTP Strict Transport Security 标头:如果服务器设置了它们,客户端(支持 HSTS,如 Chrome)意味着对于该主机的所有后续请求都坚持使用 HTTPS。

  • 永久重定向。如果您获得的初始重定向是使用"301 Moved Permanently"(而不是例如 302)进行重定向,(*) 浏览器应该记住它(“请求的资源已经分配了一个新的永久 URI,以后对该资源的任何引用都应该使用返回的 URI 之一")。

一个可能的解决方案是清除浏览器中的缓存。

(*) This question 似乎表明使用此配置的 Ruby on Rails 就是这种情况)。

【讨论】:

  • 清除缓存对我有用。我可能会补充一点,您可以在 Chrome 中进入 Inspector(开发工具),并在设置中(单击齿轮图标)并选中“禁用缓存(在 DevTools 打开时)”。然后以 http://... 访问站点,然后关闭 DevTools,您应该可以正常工作了。这避免了必须做一个完整的缓存清除(如果你不想)
  • 现在 chrome 中的图标已经发生了变化,至少在我的 Mac OS 版本中是这样。这仍然很容易,只需点击右上角的汉堡包,进入历史记录(或命令 Y 显示完整历史记录)然后点击“清除浏览数据”选择缓存(如果您愿意,您可以保留您的实际浏览历史记录)选择“Cookies和其他网站和插件数据”和“缓存的图像和文件”然后你就设置好了。
【解决方案2】:

我有同样的问题。我所做的是使用一个 ssl 强制执行器 gem,它添加了一个处理 ssl 和重定向的中间件。它有一个严格的选项来强制执行配置的协议。

在您的 Gemfile 中添加:

gem 'rack-ssl-enforcer'

在 production.rb 中添加:

config.middleware.use Rack::SslEnforcer, only: %r{your_regex_condition}, strict: true

这将强制要求的页面是安全的,而其余页面是非安全的。它禁用了 chrome 中存在问题的 HSTS 标头(重定向缓存问题)。

您还可以使所有客户端的缓存过期(如果它已经存在),以确保您不会获得无限重定向:

config.middleware.use Rack::SslEnforcer, only: %r{your_regex_condition}, :hsts => { :expires => 1, :subdomains => false }

同时删除 production.rb 中的 ssl 强制(否则可能与此中间件冲突):

config.force_ssl = false

【讨论】:

    【解决方案3】:

    让我们看看在您更新配置文件后发生了什么:

    config.force_ssl = true
    

    这导致Rack SSL Middleware 作为第一个中间件加载。正如您在代码中看到的,Rack SSL 通过将此行添加到标题中来设置HSTS header

    Strict-Transport-Security
    

    它告诉 Chrome 等受支持的浏览器仅使用 HTTPS 访问您的网站。

    所以一旦你退后:

    config.force_ssl = false
    

    Chrome 仍将使用 HTTPS 访问您的网站并导致错误。

    要解决此问题,您需要清空 HSTS 缓存。您可以通过在 chrome 浏览器中访问以下 url 来实现: chrome://net-internals/#hsts

    【讨论】:

      【解决方案4】:

      当你在 localhost 时打开你的 Chrome 开发者工具:然后你可以右击刷新按钮 ↻ 并选择“清空缓存并硬重新加载”。

      如果您在启用了 HSTS 的生产环境中启动服务器,您也可能会遇到此错误。

      Chrome 会将您重定向到 https://localhost:3000/ 并显示“SSL 连接错误”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-16
        • 1970-01-01
        • 2012-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-15
        相关资源
        最近更新 更多