Cloudflare 上的 Heroku 自定义域:重定向太多
Heroku custom domains on Cloudflare: Too many redirects
目标
- 运行 https://rapid.essbap.org 通过 Cloudflare。
- 这应该映射到 https://ebcc-rrn.herokuapp.com(Rails 应用程序)
- 但是,我得到 "too many redirects" 页,例如
- 以前在其他 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 设置
刚刚添加:
运行宁卷曲
当我 运行 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 Flexible
到 Full
成功了。
直接在 CloudFlare 上使用 Crypto -> "Always use HTTPS": ON 就成功了。
SSL 不是由 rails 强制执行的,而是通过此选项强制执行的。
不确定这种方法是否有任何缺点。
目标
- 运行 https://rapid.essbap.org 通过 Cloudflare。
- 这应该映射到 https://ebcc-rrn.herokuapp.com(Rails 应用程序)
- 但是,我得到 "too many redirects" 页,例如
- 以前在其他 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 设置
刚刚添加:
运行宁卷曲
当我 运行 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
.
我的案例设置 Crypto -> SSL Flexible
到 Full
成功了。
直接在 CloudFlare 上使用 Crypto -> "Always use HTTPS": ON 就成功了。
SSL 不是由 rails 强制执行的,而是通过此选项强制执行的。
不确定这种方法是否有任何缺点。