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

Posted

技术标签:

【中文标题】Cloudflare 上的 Heroku 自定义域:重定向过多【英文标题】:Heroku custom domains on Cloudflare: Too many redirects 【发布时间】:2015-10-21 16:35:53 【问题描述】:

目标

通过 Cloudflare 运行 https://rapid.essbap.org。 这应该映射到https://ebcc-rrn.herokuapp.com(Rails 应用程序) 但是,我收到“重定向过多”页面,例如

之前已在其他 Heroku 应用上成功完成此操作,使用以下步骤 我错过了什么?

我做了什么

通过 Godaddy 购买 essbap.org。 已将 DNS 导入 Cloudflare。 在 Godaddy 插入 Cloudflare 名称服务器。 从 Godaddy 中删除了区域记录。

Cloudflare:

插入 CNAME 记录 rapid 以指向 ebcc-rrn.herokuapp.com 在 Heroku 上:将自定义域 rapid.essbap.org 添加到 ebcc-rrn.herokuapp.com

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 设置

刚刚添加:

跑步卷曲

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

$ 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)。一个 301 然后 200。

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

$ 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 中发生。

我错过了什么?

【问题讨论】:

也看到我在这里发布的这个解决方案,可以帮助:***.com/questions/43141495/… 【参考方案1】:

如果我将该 URL 卷曲到 https://rapid.essbap.org/ 上,看起来您已将其重定向回 https://rapid.essbap.org/

curl -v https://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 域验证安全服务器 CA 2 * 服务器证书:COMODO ECC 证书颁发机构 * 服务器证书:AddTrust External CA Root

GET / HTTP/1.1 用户代理:curl/7.37.1 主持人:rapid.essbap.org 接受:/

https://rapid.essbap.org/

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

GET / HTTP/1.1 用户代理:curl/7.37.1 主持人:rapid.essbap.org 接受:/

https://rapid.essbap.org/

【讨论】:

谢谢,重定向返回与 Heroku 自定义域应用程序的预期行为一致。我将此与工作 Heroku 自定义域应用程序进行了比较(根据我的问题的补充)。但是https://rapid.essbap.org 应该返回 200 而不是 301。试图找出为什么会这样。 如果您有权访问 Cloudflare 支持请求,则为 #508914【参考方案2】:

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

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

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

现在一切都按计划进行。

【讨论】:

我的 md2pdf.herokuapp.com 也有同样的问题。域来自 nic.io,DNS 由 dyn.com 在尝试切换到 cloudflare 之前提供。【参考方案3】:

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

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

【讨论】:

对我来说正好相反——我在 Heroku 网站上设置了 SSL,并且不断通过 Cloudlfare SSL 获得太多重定向,例如 OffFlexible。将其设置为 Full (strict) 对我有用,因为 SSL 已经存在于服务器上。【参考方案4】:

我的情况是将 Crypto -> SSL Flexible 设置为 Full 成功了。

【讨论】:

【参考方案5】:

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

SSL 不是由 rails 强制执行的,而是由这个选项强制执行的。

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

【讨论】:

以上是关于Cloudflare 上的 Heroku 自定义域:重定向过多的主要内容,如果未能解决你的问题,请参考以下文章

Cloudflare 为 Cloudflare 页面去除自定义域上的标头

Heroku 上的 Django manage.py 自定义命令

Heroku + Cloudflare 完全免费的 SSL

使用 CloudFlare、Heroku 和 RoR 时如何设置真实 IP 地址?

在 Heroku 上的 Rails 中为 Authorize.net AIM API 使用自定义证书

我收到错误 400:自定义 Heroku 域上的错误请求,但在 foo.herokuapp.com 上工作正常