有一个很好的选项来配置Rails应用程序:
config.force_ssl = true
然而,似乎只是将其设置为true并不能使HTTPS连接正常工作。更多 - 尝试(并且失败)与Chrome连接到https://localhost:3000后,我将此选项设置为false,即使我写了http,Chrome仍然会尝试打开https。
所以,有几个问题:
- 如何强制Chrome不再尝试https? - 在我的Rails应用程序上启用SSL的正确方法是什么?
更新:该应用程序在Heroku上运行,似乎自动支持https。我可以在本地测试SSL吗?就像运行rails服务器一样?
答案 0 :(得分:5)
首先,我应该说我没有尝试过,但Chrome仍然使用HTTPS主要有两个原因:
使用HTTP Strict Transport Security标头:如果服务器设置了这些标头,则客户端(支持HSTS,如Chrome)会针对该主机的所有后续请求坚持使用HTTPS。
永久重定向。如果您获得的初始重定向是使用"301 Moved Permanently"(而不是302)来进行重定向,那么(*)浏览器就是要记住它(“请求的资源已被分配一个新的永久URI,以及此资源的任何未来引用应该使用返回的URI之一“)。
可能的解决方法是清除浏览器中的缓存。
(*) This question似乎表明带有此配置的Ruby on Rails就是这种情况。)
答案 1 :(得分:2)
我有同样的问题。我所做的是使用ssl enforcer 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
答案 2 :(得分:1)
让我们看看使用以下内容更新配置文件后发生了什么:
config.force_ssl = true
这导致Rack SSL Middleware被加载为第一个中间件。正如您在代码中看到的,Rack SSL通过将此行添加到标题中来设置HSTS header:
Strict-Transport-Security
它告知Chrome等受支持的浏览器仅使用HTTPS访问您的网站。
所以一旦你退缩:
config.force_ssl = false
Chrome仍会使用HTTPS访问您的网站并导致错误。
要解决此问题,您需要清空HSTS缓存。您可以通过转到Chrome浏览器中的以下网址来实现此目的: 铬://净内部/#HSTS
答案 3 :(得分:0)
当您在localhost时打开Chrome开发者工具:然后您可以右键单击刷新按钮LinkedIn并选择“清空缓存和硬重新加载”。
如果在启用了HSTS的生产环境中启动服务器,也可能会发生此错误。
Chrome会将您重定向到https://localhost:3000/并说“SSL连接错误”。