Cloudflare 上的 Heroku 自定义域:重定向太多

Heroku custom domains on Cloudflare: Too many redirects

目标

我做了什么

Cloudflare:

Heroku:

heroku domains:add rapid.essbap.org

=== ebcc-rrn Heroku Domain
ebcc-rrn.herokuapp.com

=== ebcc-rrn Custom Domains
Domain Name       DNS Target
----------------  ----------------------
rapid.essbap.org  ebcc-rrn.herokuapp.com 

$ host rapid.essbap.org 
rapid.essbap.org has address 104.27.162.137 
rapid.essbap.org has address 104.27.163.137

Cloudflare 设置

刚刚添加:

运行宁卷曲

当我 运行 curl 对抗另一个我知道有效的 Heroku 自定义域应用程序时,它看起来像:

$ curl -I some.custom_app.com
HTTP/1.1 301 Moved Permanently
Location: https://some.custom_app.com/

# since I'm using force_ssl on Rails, we expect to be directed to https://

$ curl -I https://some.custom_app.com/
HTTP/1.1 200 OK

ebcc-rrn.herokuapp.com 的类似行为(我们希望 rapid.essbap.org 作为 Herokuapp 的别名)。 A 301 然后 200.

但是当我 运行 curl 对抗 rapid.essbap.org 时,我得到:

$ curl -I rapid.essbap.org
HTTP/1.1 301 Moved Permanently
Location: https://rapid.essbap.org/

# since I'm using force_ssl on Rails, we expect to be directed to https://

$ curl -I https://rapid.essbap.org
HTTP/1.1 301 Moved Permanently
Location: https://rapid.essbap.org/

在第二种情况下,我们得到的是 301 而不是 200。我不确定为什么会生成 301。在 dev 或 ebcc-rrn.herokuapp.com.

中不会发生

我错过了什么?

如果我 curl 那 url 超过 https://rapid.essbap.org/, it looks like you have it redirecting back to https://rapid.essbap.org/

curl-vhttps://rapid.essbap.org * 将 URL 重建为:https://rapid.essbap.org/ * 在 DNS 缓存中找不到主机名 * 尝试 2400:cb00:2048:1::681b:a389... * 连接到 rapid.essbap.org (2400:cb00:2048:1::681b:a389) 端口 443 (#0) * 使用 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 的 TLS 1.2 连接 * 服务器证书:sni95196.cloudflaressl.com * 服务器证书:COMODO ECC Domain Validation Secure Server CA 2 * 服务器证书:COMODO ECC Certification Authority * 服务器证书:AddTrust External CA Root

GET / HTTP/1.1 User-Agent: curl/7.37.1 Host: rapid.essbap.org Accept: /

< HTTP/1.1 301 Moved Permanently * Server cloudflare-nginx is not blacklisted < Server: cloudflare-nginx < Date: Thu, 30 Jul 2015 23:37:57 GMT < Content-Type: text/html < Transfer-Encoding: chunked < Connection: keep-alive < Set-Cookie: __cfduid=ddc8d6151d53a0e3d3eab0789f0b811851438299465; expires=Fri, 29-Jul-16 23:37:45 GMT; path=/; domain=.essbap.org; HttpOnly < Location: https://rapid.essbap.org/ < Via: 1.1 vegur < CF-RAY: 20e4e4ab2489281c-SJC

http://rapid.essbap.org/ * 在 DNS 缓存中找不到主机名 * 尝试 2400:cb00:2048:1::681b:a389... * 连接到 rapid.essbap.org (::1) 端口 80 (#0)

GET / HTTP/1.1 User-Agent: curl/7.37.1 Host: rapid.essbap.org Accept: /

< HTTP/1.1 301 Moved Permanently < Date: Thu, 30 Jul 2015 23:40:57 GMT < Content-Type: text/html < Transfer-Encoding: chunked < Connection: keep-alive < Set-Cookie: __cfduid=d5b6d3a1c46df56fcd623454bba7c9d121438299657; expires=Fri, 29-Jul-16 23:40:57 GMT; path=/; domain=.essbap.org; HttpOnly < Location: https://rapid.essbap.org/ < Via: 1.1 vegur * Server cloudflare-nginx is not blacklisted < Server: cloudflare-nginx < CF-RAY: 20e4e95a0abf281c-SJC

不幸的是,没有确定的解决方案(但非常感谢 Heroku 的技术帮助)。

通过回滚并重试设法解决了问题:

  • 正在将 DNS 传回 Godaddy
  • 从 Cloudflare 擦除域
  • 使用 Godaddy 确保功能
  • 在 Cloudflare 上创建域
  • 再次转移到 Cloudflare

现在一切都按计划进行。

我最近在使用 Heroku、Cloudflare 和 SSL 的网站上遇到了同样的问题。

在我们的案例中,解决方案是我们必须在 Cloudflare 中的 Crypto > SSL 下将 SSL 选项设置为 Flexible。我们在 Full 上发现了它,这导致网站尝试使用 CloudFlare 的 SSL 证书。它不适用于设置为 Off.

的 SSL 选项

我的案例设置 Crypto -> SSL FlexibleFull 成功了。

直接在 CloudFlare 上使用 Crypto -> "Always use HTTPS": ON 就成功了。

SSL 不是由 rails 强制执行的,而是通过此选项强制执行的。

不确定这种方法是否有任何缺点。