ruby on rails - Heroku SSL on root domain



我正在尝试为我的heroku应用程序设置SSL。我正在使用基于主机名的SSL附加组件。heroku 文档指出如下:

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 支持重定向记录。我在SO上遇到了一个关于类似主题的问题。 我尝试了解决方案,它仅适用于 HTTP 重定向(Zerigo 文档证实了这一点(。

我的泽里戈配置:

foo.com      A             x.x.x.x
foo.com      redirect      http://www.foo.com
www.foo.com  CNAME         zzz.amazonaws.com

2( 基于机架的重定向

添加基于机架的中间件以执行重定向。规范主机 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的Endpoint SSL产品($ 20/月(

它适用于以下所有 URL(将它们重定向到 https://foo.com,没有警告(

  • http://foo.com
  • http://www.foo.com
  • https://www.foo.com
  • https://foo.com

总结一下重要的一点。

  1. 将您的DNS移动到DNSimple(如果有人知道其他提供商提供ALIAS记录,请在评论中发布它们,它们是我唯一能找到的提供商(
  2. 将 Heroku 端点 SSL 设置为正常 https://devcenter.heroku.com/articles/ssl-endpoint
  3. 回到 DNSimple 添加一个ALIAS记录,将foo.com指向您的 heroku ssl 端点,类似于 waterfall-9359.herokussl.com
  4. 此外,添加将www.foo.com指向 heroku SSL 终端节点的 CNAME 记录,waterfall-9359.herokussl.com
  5. 最后,在您的 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 记录。 如果有人知道,我很想知道它是如何工作的,以及它的可靠性/成熟度。 似乎可以解决问题。

DNSimple 提供了一个 ALIAS 记录类型来满足这一需求。您可以从根域(也称为区域顶点(创建指向 CNAME 的别名。在这里阅读更多关于它的信息:

http://blog.dnsimple.com/introducing-the-alias-record/

DNS 重定向不会关心入站请求是 http 还是 https,因此会维护原始协议 - 因此会将 http://foo.com 重定向到 http://www.foo.com 并且 https 也是如此。

您需要通过您找到的 gem 或其他一些机架重定向 gem 在应用程序中执行此操作,或者如果 www. 是使用基于 IP 的 SSL 插件的问题。

您要记住的一件事是,如果两个版本都可以访问,Google可能会将您网站的两个版本都编入索引(根与WWW(。您需要设置圆锥体来处理维护起来可能很痛苦的事情。

在我的 DNS 设置中,我设置了一个 URL/转发记录(DNS 简单(

URL foo.com     3600        http://www.foo.com

只需为 WWW 设置 CNAME 设置

CNAME   www.foo.com 3600        providedsslendpoint.herokussl.com

我还必须为我的根设置和别名

ALIAS   foo.com 3600        providedsslendpoint.herokussl.com

然后我决定简单地用 env 变量ENV['SITE_HOST']替换 foo.com(其中 SITE_HOST= www.foo.com 或我可能定义的任何内容(。我可以通过我的 heroku 配置或我的 .env 文件来控制它(见 https://github.com/bkeepers/dotenv(。这样,我就可以控制不同环境中发生的事情。

例如,我的测试应用程序使用 test.foo.com 作为 url,它也有自己的 SSL 端点,因此对我来说效果很好。这还可以扩展以创建暂存或 qa 特定环境。

  before_filter :check_domain
  def check_domain
    if Rails.env.production? || Rails.env.testing? and request.host.downcase != ENV['SITE_HOST']
      redirect_to request.protocol + ENV['SITE_HOST'] + request.fullpath, :status => 301
    end
  end

从现在开始,最终用户将始终使用强制 SSL 访问 www。旧链接会遭受一个小的挂起,但没有什么明显的。

在 Rails

部分,要进行重定向,让它发生在路由器层会更理智,就像这样(适用于 Rails 3+(:

Rails.application.routes.draw do
  match '/*splat' => redirect { |_, request| request.url.sub('//www.', '//') }, :constraints => { :subdomain => 'www' }
  # ...
end

对于那些之前使用 godaddy 的 heroku 用户,我刚刚完成了将 DNS 从 godaddy 移植到 cloudflare。https 现在工作正常。

Godaddy DNS与heroku不兼容。这是由于:

某些 DNS 提供商将仅提供根域的 A 记录。 不幸的是,A 记录不足以指向您的根 域到 Heroku,因为它们需要一个静态 IP。这些记录有 在以下环境中使用时会严重影响可用性 本地数据中心、云基础架构服务和平台 比如希罗库。由于 Heroku 使用动态 IP 地址,因此有必要 使用类似别名记录(通常称为别名或 ANAME 记录( 以便您可以将根域指向另一个域。

设置相当简单。

首先,将Cloudflare的名称服务器添加到godaddy dns管理器中。以下是一些示例:

roxy.ns.cloudflare.com sam.ns.cloudflare.com

接下来,您只需要另外两个步骤。

  1. 添加别名记录NAME.com并将其链接到NAME.com.herokudns.com
  2. 就是这样。这是假设您已经有一个链接到www.NAME.com.herokudns.com的 CNAME www.NAME.com

如果您使用的是 Rails,请确保将config.force_ssl = true设置为 config/environment/production.rb

我发现DNSimple对于我目前的Web开发人员能力来说很复杂。我最终注册了easyDNS,并将我在Godaddy购买的域名转移到easyDNS。标准 easyDNS 订阅的年度费用目前为 20 美元。easyDNS的好处是他们实际上接听了电话。在电话上几分钟,我为 Heroku 正确配置了我的 DNS 目标。测试了我的应用程序,它适用于HTTP。当我将我的 heroku 应用程序升级到付费爱好测功机(目前为 7 美元/月(时,它立即应用 SSL 保护。再次在浏览器中测试了我的应用程序,它可以通过HTTP和HTTPS提供服务。接下来,我在我的nodejs应用程序中取消注释了一些重定向http => https的代码。在浏览器中再进行一次测试,似乎很好。安全。适用于 www,也适用于根域。底线:您可能不必以$ 20/mo的价格购买Heroku端点。希望有帮助。

最新更新