Rails:激活SSL支持让Chrome感到困惑

有一个很好的选项来配置Rails应用程序:

config.force_ssl = true

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

所以,几个问题:

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

更新:该应用程序在Heroku上运行,似乎自动支持https。 我可以在本地测试SSL吗? 喜欢运行rails服务器?

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

  • 使用HTTP严格传输安全标头:如果服务器设置它们,则客户端(支持HSTS,如Chrome)将针对所有后续请求到该主机而坚持使用HTTPS。

  • 永久重定向。 如果你得到的初始重定向是使用“301 Moved Permanently” (而不是302)来进行重定向, (*)浏览器应该记住它(“ 已经为所请求的资源分配了一个新的永久URI和任何未来对此资源的引用应该使用返回的URI之一 “)。

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

(*) 这个问题似乎表明这个配置是Ruby on Rails的情况。

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

在你的Gemfile中添加:

gem 'rack-ssl-enforcer' 

在production.rb中添加:

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

这将强制所请求的页面得到保护,其余页面不受保护。 它禁用了HSTS标头,这在chrome(重定向缓存问题)中存在问题。

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

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

还删除了production.rb中的ssl强制执行(否则可能与此中间件冲突):

 config.force_ssl = false 

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

 config.force_ssl = true 

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

 Strict-Transport-Security 

它会告知受支持的浏览器(例如Chrome)仅使用HTTPS访问您的网站。

所以一旦你退缩:

 config.force_ssl = false 

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

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

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

如果在生成HSTS的生产环境中启动服务器,也可能会发生此错误。

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