7

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

config.force_ssl = true

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

所以,有几个问题:

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

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

4

4 回答 4

5

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

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

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

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

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

于 2012-05-04T11:54:56.577 回答
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
于 2012-11-18T09:42:34.000 回答
1

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

config.force_ssl = true

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

Strict-Transport-Security

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

所以一旦你退后:

config.force_ssl = false

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

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

于 2014-01-21T10:14:34.563 回答
0

当你在 localhost 时打开你的 Chrome 开发者工具:然后你可以右击刷新按钮 ↻ 并选择“Empty cache and hard reload”。

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

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

于 2015-11-06T19:04:56.890 回答