我正在尝试为我的 heroku 应用程序设置 SSL。我正在使用基于主机名的 SSL 附加组件。 heroku documentation说明如下:
Hostname based SSL will not work with root domains as it relies on CNAME
aliasing of your custom domain names. CNAME aliasing of root domains is
an RFC violation.
正如预期的那样,当我使用 www 子域(即 https://www.foo.com)访问网站时一切正常。 。当我访问 时浏览器提示 https://foo.com 因为出示的证书是针对 heroku.com 的。
我得出结论,我必须将 foo.com 的流量重定向到 www.foo.com 以解决此问题。我正在考虑以下方法:
1) 基于 DNS 的重定向
DNS 提供商 Zerigo supports 重定向 记录。我遇到了 question关于 SO 的类似主题。我尝试了该解决方案,它仅适用于 HTTP 重定向(Zerigo 文档证实了这一点)。
我的 Zerigo 配置:
foo.com A x.x.x.x
foo.com redirect http://www.foo.com
www.foo.com CNAME zzz.amazonaws.com
2) 基于机架的重定向
添加一个基于机架的中间件来执行重定向。 canonical-host gem 提供了这样的支持。
use CanonicalHost do
case Rails.env.to_sym
when :staging then 'staging.foo.com'
when :production then 'www.foo.com'
end
end
我想知道是否有更好的解决方案(除非切换到每月 100 美元的基于 IP 的 SSL)
最佳答案
哇...这花了我很长时间,网上的一堆信息都是错误的。甚至 Heroku 的文档似乎也没有表明这是可能的。
但 Jesper J 的回答提供了正确方向的提示:它与 DNSimple 的 ALIAS 记录一起工作,我猜这是他们创建的某种新型 DNS 记录。我不得不将我的 DNS 服务切换到他们那里才能获得这种记录类型(以前使用 EasyDNS)。
澄清一下,当我说“有效”时,我的意思是:
- 使用您的根域在 SSL 上访问整个网站
- 没有浏览器警告
- 使用 Heroku 的端点 SSL 产品(20 美元/月)
它适用于所有以下 url(将它们重定向到 https://foo.com,没有警告)
总结重要部分。
- 将您的 DNS 移至 DNSimple(如果有人知道其他提供 ALIAS 记录的提供商,请将其张贴在评论中,他们是我唯一能找到的提供商)
- 正常设置 Heroku 端点 ssl https://devcenter.heroku.com/articles/ssl-endpoint
- 返回 DNSimple,添加一个
ALIAS
记录,将foo.com
指向您的 heroku ssl 端点,类似于waterfall-9359.herokussl.com
- 同时将指向
www.foo.com
的 CNAME 记录添加到您的 heroku ssl 端点waterfall-9359.herokussl.com
- 最后在您的 Rails(或其他)应用程序中进行以下设置:
在production.rb
中设置
config.force_ssl = true
在application_controller.rb
中添加
before_filter :check_domain
def check_domain
if Rails.env.production? and request.host.downcase != 'foo.com'
redirect_to request.protocol + 'foo.com' + request.fullpath, :status => 301
end
end
这似乎终于奏效了!关键部分似乎是 ALIAS
dns 记录。如果有人知道,我很想了解更多关于它是如何工作的,以及它有多可靠/成熟。不过似乎可以解决问题。
关于ruby-on-rails - 根域上的 Heroku SSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6701549/