通过SSL访问时,将子域重定向到根域

时间:2015-03-26 19:04:33

标签: ruby-on-rails ruby ruby-on-rails-4

我想将人们从www.mydomain.com重定向到mydomain.com。 我还想强迫人们使用SSL。 为此,我写了两个中间件类。一个从www子域重定向到根域:

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

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

  def each(&block)
  end
end

第二个强制SSL连接:

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

  def call(env)
    req = Rack::Request.new(env)
    if env['HTTPS'] == 'on' || env['HTTP_X_FORWARDED_PROTO'] == 'https'
      @app.call(env)
    else
      [301, {"Location" => req.url.gsub(/^http:/, "https:")}, []]
    end
  end
end

除非我特意在网址栏中输入https://www.example.com,否则这种情况很有效。这似乎是在中间件执行之前通过SSL进入我的应用程序。我在浏览器中收到此消息:

This server could not prove that it is www.example.com; its security certificate is from example.com.

如何更改此行为?我正在使用Heroku进行制作。是否有任何我不知道的创业板呢?

1 个答案:

答案 0 :(得分:1)

您无法更改此行为:浏览器正在尝试连接到https://www.example.com,但您的证书适用于其他域。此时您的申请并未参与其中。

处理此问题的唯一方法是获得对www.example.com和example.com都有效的ssl证书