force_ssl Rails 4 上的重定向循环使用 CloudFlare SSL

force_ssl redirect loop on Rails 4 using CloudFlare SSL

在使用 force_ssl 方法(使用 CloudFlare 的一键式 SSL 功能实现的 SSL)强制执行 SSL 时,我的 Rails 4 应用程序出现了重定向循环。

当我从 "flexible" 切换到 CloudFlare 中的 "full" SSL 设置时,这种情况就停止了。

Cloudflare 正在尝试通过 HTTP 强制连接,因为您的服务器没有 HTTPS,但您的应用正在强制使用 SSL。

问题

这发生在一组特定的情况下:

  1. 您的 Cloudflare (CF) SSL 设置是 Flexible 并且 CF 和 Heroku 之间允许 HTTP。
  2. 您的服务器或 Heroku 实例的 SSL 未设置,因此它强制在 HTTP
  3. 之间建立连接

发生的事情是:

  1. 您通过 HTTPS
  2. 连接到域
  3. Cloudflare 介入处理 SSL 部分,并尝试通过纯 HTTP 从服务器获取应用程序
  4. 服务器发现 HTTP 连接并重定向到 HTTPS
  5. 转到步骤 1

这会导致无限重定向循环。

解决方案

将您的应用服务器升​​级到 HTTPS,这将解决重定向问题。然后,为了安全起见,将 Cloudflare 切换到 Full.

首先: 我在我的服务器上配置了 SSL。就我而言,我使用的是 Heroku,它可以使用 Let's Encrypt 自动配置 SSL。如果不是,您会直接使用 Let's Encrypt。 Cloudflare 还提供自签名原始证书,但既然 Let's Encrypt 既简单又免费,为什么还要麻烦呢。

其次: 我通过将以下内容添加到 production.rb

,将我的应用配置为强制使用 SSL
config.force_ssl = true

第三: 因为我的服务器和 Cloudflare 之间不再需要 HTTP 连接,所以我将其从 Flexible 切换到 Full。如果您已使用 Let's Encrypt 或 CA 提供服务器证书,则可以切换到 Flexible (Strict).