Heroku的SSL上的根域Heroku的SSL上的根域(Heroku SSL on root do

2019-05-13 09:22发布

我试图建立SSL为我的Heroku应用程序。 我使用的是基于主机名的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文档证实了这一点)。

我Zerigo配置:

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

2)基于机架重定向

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

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)一个更好的解决方案

Answer 1:

哇......这花了我永远的,和一群在网络上的信息是错误的。 即使Heroku的文档似乎并没有表明这是可能的。

但加斯帕J的答案提供了一个正确的方向暗示:它与我的猜测是DNS记录的某种新的,他们创造DNSimple的别名记录。 我必须在我的切换DNS服务,他们只是为了得到这个记录类型(以前用EasyDNS)。

为了澄清,当我说“作品”我的意思是:

  • 在SSL整个网站使用您的根域
  • 没有浏览器的警告
  • 使用Heroku的端点SSL产品($ 20 /月)

它适用于所有下列网址的(其重定向到https://foo.com没有警告)

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

总结的重要位。

  1. 在移动你的DNS来DNSimple(如果有人知道其他供应商提供了一个别名记录,请张贴在他们的意见,他们是唯一一个我能找到)
  2. 设置Heroku的SSL端点正常https://devcenter.heroku.com/articles/ssl-endpoint
  3. 早在DNSimple添加一个ALIAS记录指向foo.com到您的Heroku的SSL端点,像waterfall-9359.herokussl.com
  4. 还添加CNAME记录指向www.foo.com到您的Heroku的SSL端点, waterfall-9359.herokussl.com
  5. 终于在轨(或其他)的应用程序进行如下设置:

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记录。 我会很想更多地了解它是如何工作的,如果有人知道,如何可靠/成熟是。 看来,虽然做的伎俩。



Answer 2:

DNSimple提供了一个别名记录类型,以满足这一需求。 您可以从您的根域(又名区顶点)的别名指向一个CNAME。 了解更多关于在这里:

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



Answer 3:

DNS重定向不会在意入站请求是否是HTTP或HTTPS,从而将维持原协议-这样会重定向http://foo.com到http://www.foo.com与同为HTTPS。

你需要通过你找到宝石或者其他一些机架重定向宝石或者WWW应用程序内做到这一点。 是一个问题,使用基于IP的SSL插件。



Answer 4:

有一件事你会想记住的是,谷歌可能索引你的网站的两个版本,如果这两个版本都可以访问(根VS WWW)。 您将需要设置conicals来处理,这可能是一个痛苦的维护。

在我的DNS设置,我设置了一个URL /正向记录(DNS简单)

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

该CNAME设置只需要设置为WWW

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

我也不得不设置和别名为我的根

ALIAS   foo.com 3600        providedsslendpoint.herokussl.com

然后我决定简单地与环境变量替换foo.com ENV['SITE_HOST']其中SITE_HOST = www.foo.com或任何我可能定义)。 我可以通过我的Heroku的配置或我的.ENV文件(详见控制这个https://github.com/bkeepers/dotenv )。 这样的话,我还可以控制在不同的环境会发生什么。

例如,我的测试应用程序使用test.foo.com,因为它也有自己的SSL端点,这样对我来说工作正常的URL。 这也扩展到创建临时或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。 旧链接将有一个小的坑,但没有明显的。



Answer 5:

在导轨上的一部分,使重定向,它会更理智,使其发生路由器层上,这样的(工作on Rails的3+):

Rails.application.routes.draw do

  match '/*splat' => redirect { |_, request| request.url.sub('//www.', '//') }, :constraints => { :subdomain => 'www' }

  # ...

end


Answer 6:

对于使用GoDaddy的前面那些Heroku的用户,我只是完成从GoDaddy的在移植DNS来的CloudFlare。 和HTTPS现在是工作的罚款。

Godaddy的DNS与Heroku的不兼容。 这是因为:

一些DNS提供商将只提供一种根域的记录。 不幸的是,因为他们需要一个静态IP A记录是不够的指向您的根域的Heroku。 的环境中使用,例如内部部署的数据中心,云基础设施服务,以及像Heroku的平台时,这些记录有严重的可用性问题。 由于Heroku的使用动态IP地址,这是需要使用CNAME形记录(通常被称为别名或ANAME记录),这样就可以将您的根域到其他域。

设置是相当简单的。

首先,添加的CloudFlare的域名服务器到GoDaddy的DNS管理器。 以下是一些例子:

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

接下来,你只需要两个步骤。

  1. 添加CNAME NAME.com并将其链接到NAME.com.herokudns.com
  2. 而已。 这是假设你已经有了一个CNAME www.NAME.comwww.NAME.com.herokudns.com

如果您使用Rails,一定要设置config.force_ssl = trueconfig/environment/production.rb



文章来源: Heroku SSL on root domain