首页 文章

根域上的Heroku SSL

提问于
浏览
32

我正在尝试为我的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 based redirection

DNS提供商Zerigo supports重定向记录 . 我在SO上发现了一个关于类似主题的question . 我尝试了解决方案,它只适用于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) Rack based redirection

添加基于机架的中间件以执行重定向 . 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)

6 回答

  • 1

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

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

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

    • 使用根域的SSL上的整个站点

    • 没有浏览器警告

    • 使用Heroku的Endpoint SSL产品(每月20美元)

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

    总结重要的一点 .

    • 将你的DNS转移到DNSimple(如果有人知道提供ALIAS记录的其他提供商请将它们发布在评论中,它们是我能找到的唯一一个)

    • 设置Heroku endpoints ssl正常https://devcenter.heroku.com/articles/ssl-endpoint

    • 返回DNSimple添加 ALIAS 记录,指向 foo.com 到您的heroku ssl endpoints ,类似于 waterfall-9359.herokussl.com

    • 还要添加一条指向 www.foo.com 的CNAME记录到您的heroku ssl endpoints , 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记录 . 如果有人知道,我会很好奇地了解它是如何工作的,以及它是多么可靠/成熟 . 似乎可以做到这一点 .

  • 1

    DNSimple提供ALIAS记录类型以满足此需求 . 您可以从指向CNAME的根域(a.k.a zone apex)创建别名 . 在这里阅读更多相关信息:

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

  • 0

    DNS重定向不关心入站请求是http还是https,因此会保留原始协议 - 因此会将http://foo.com重定向到http://www.foo.com,对于https也是如此 .

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

  • 39

    您要记住的一件事是,如果两个版本都可访问,谷歌可能会为您的网站的两个版本编制索引(Root vs WWW) . 您需要设置锥形来处理可能需要维护的痛苦 .

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

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

    只需要为WWW设置CNAME设置

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

    我还必须为我的root设置和Alias

    ALIAS   foo.com 3600        providedsslendpoint.herokussl.com
    

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

    例如,我的测试应用程序使用 test.foo.com 作为URL它也有自己的SSL endpoints ,这样我就可以正常工作 . 这也可以扩展到创建临时或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 . 旧的链接将遭受一个小挂,但没有什么值得注意的 .

  • 8

    在Rails部分,为了进行重定向,让它更容易在路由器层上出现,就像这样(适用于Rails 3):

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

    对于那些以前使用godaddy的heroku用户,我刚刚完成从godaddy到cloudflare的DNS移植 . 并且https现在正常运行 .

    Godaddy DNS与heroku不兼容 . 还有这个是由于:

    某些DNS提供商仅提供根域的A记录 . 不幸的是,A记录不足以将根域指向Heroku,因为它们需要静态IP . 当在诸如内部数据中心, Cloud 基础架构服务和Heroku等平台的环境中使用时,这些记录具有严重的可用性影响 . 由于Heroku使用动态IP地址,因此必须使用类似CNAME的记录(通常称为ALIAS或ANAME记录),以便您可以将根域指向另一个域 .

    设置非常简单 .

    首先,将cloudflare的名称服务器添加到godaddy dns管理器中 . 这些是一些例子:

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

    接下来,您只需要再执行两个步骤 .

    • 添加CNAME NAME.com 并将其链接到 NAME.com.herokudns.com

    • 就是这样 . 这假设你已经有一个CNAME www.NAME.com 链接到 www.NAME.com.herokudns.com

    如果您使用的是Rails,请务必在 config/environment/production.rb 设置 config.force_ssl = true

相关问题