根域上的Heroku SSL

Har*_*tty 33 ssl ruby-on-rails heroku

我正在尝试为我的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. 
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,当我使用www子域访问网站时,一切都运行良好,即https://www.foo.com.当我访问https://foo.com时,浏览器会抱怨,因为提供的证书是针对heroku.com的.

我得出结论,我必须将foo.com的流量重定向到www.foo.com以解决此问题.我正在考虑以下方法:

1)基于DNS的重定向

该DNS提供商Zerigo 支持重定向记录.我在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
Run Code Online (Sandbox Code Playgroud)

2)基于机架的重定向

添加基于机架的中间件以执行重定向.该规范的主机宝石提供这样的支持.

use CanonicalHost do
  case Rails.env.to_sym
    when :staging     then 'staging.foo.com'
    when :production  then 'www.foo.com'
  end
end
Run Code Online (Sandbox Code Playgroud)

我想知道是否有更好的解决方案(除非转换为每月100美元的基于IP的SSL)

Bri*_*ong 40

哇...这让我永远,网上的一堆信息都是错的.即使Heroku的文档似乎也没有表明这是可能的.

但是Jesper J的回答提供了一个正确方向的暗示:它与DNSimple的ALIAS记录一起使用,我想这是他们创建的一种新的DNS记录.我不得不将我的DNS服务切换到它们只是为了获得这种记录类型(以前使用EasyDNS).

澄清何时我说"工作"我的意思是:

  • 使用根域的SSL上的整个站点
  • 没有浏览器警告
  • 使用Heroku的终端SSL产品(每月20美元)

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

总结重要的一点.

  1. 将你的DNS转移到DNSimple(如果有人知道提供ALIAS记录的其他提供商请将它们发布在评论中,它们是我能找到的唯一一个)
  2. 将Heroku端点ssl设置为正常https://devcenter.heroku.com/articles/ssl-endpoint
  3. 回到DNSimple中,添加一条ALIAS指向foo.comheroku ssl端点的记录,例如waterfall-9359.herokussl.com
  4. 还要添加指向www.foo.comheroku ssl端点的CNAME记录,waterfall-9359.herokussl.com
  5. 最后在你的rails(或其他)应用程序中进行以下设置:

production.rb集合中

config.force_ssl = true
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

这最终似乎有效!关键部分似乎是ALIASdns记录.如果有人知道,我会很好奇地了解它是如何工作的,以及它是多么可靠/成熟.似乎可以做到这一点.

  • 您能否确认您是否使用根域foo.com的证书?或者,您使用的是通配符证书*.foo.com吗?我正在为我的根域使用证书,但我的浏览器一直说www.foo.com不安全.当我关闭警告时,它按预期重定向到foo.com,一切正常. (3认同)
  • Heroku说[这里](https://devcenter.heroku.com/articles/ssl-certificate)"你必须在"主机名"字段中输入一个子域." 因为根域证书与Heroku的SSL端点不兼容.您是否创建了根域证书或类似secure.foo.com的内容?这会影响`check_domain`里面的`request.host`检查吗? (2认同)

Jes*_* J. 8

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

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