如何确保将 HTTPS 根域请求重定向到 Heroku 的 www

How to ensure HTTPS root domain requests are redirected to www for Heroku

我正在为我的 Rails 4.2 项目使用 Heroku 的通配符证书,该项目为用户的帐户提供子域。我几乎可以完美地使用它,但还有一些问题需要解决。

如果我输入 http://example.com in the brower, it get's redirected to https://www.example.com 并解析得很好。

但是 如果我输入 https://example.com 我会在我的浏览器中得到以下内容

Unable to connect. Firefox can't establish a connection to the server at mydomain.com. The site could be temporarily unavailable or too busy. Try again in a few moments....

这些是我的 DNS 设置

@ ----> http://www.example.com URL-REDIRECT(这是故意的 - Heroku 不能使用带 SSL 的裸域)

www ----> blahblah-1234.herokussl.com CNAME

子域

* ----> blahblah-1234.herokussl.com。 CNAME

除了上面提到的 DNS 'url-redirect' 我还配置了 rails 来重写根域请求。 (不过我认为请求甚至没有达到 rails)

我创建了一个中间件来将请求 'example.com' 重写为 'www.example.com' 并将其插入 before ActionDispatch::SSL

class RootToWWW
  def initialize(app)
    @app = app
  end

  def call(env)
    request = Rack::Request.new(env)
    if request.host.starts_with?('myexample.com')
      [301, {"Location" => request.url.sub("//", "//www.")}, self]
    else
      @app.call(env)
    end
  end

  def each(&block)
  end
end 


# in production.rb
config.middleware.insert_before 'ActionDispatch::SSL', 'RootToWWW'

谁能解释我如何确保对根域的 https 请求重定向到 www?

Firefox can't establish a connection

这表示无法与服务器example.com的443端口建立TCP连接。在为 example.com 提供的 IP 地址上,此域没有 SSL 服务器 运行,或者防火墙阻止了连接。

These are my DNS settings

@ ----> http://www.example.com URL-REDIRECT (This is intentional - Heroku cant use naked domains with SSL)

URL 重定向并不是真正的 DNS 东西,但它需要在 example.com 有一个网络服务器,然后将 HTTP 重定向到 www.example.com。根据您关于 Heroku 无法在裸域上处理 SSL 的评论,我建议,example.comwww.example.com 是不同的 Web 服务器,并且位于不同的 IP 地址上。在这种情况下,您将无法对裸域使用 SSL,因为裸域上​​的网络服务器根本不执行 SSL,即它不在端口 443 上侦听连接,因此您会得到“Firefox 无法建立一个联系”。如果你不能在裸域上使用 SSL,你也不能为 https 做重定向,因为这个重定向首先需要一个已建立的 SSL 连接。