【问题标题】:Redirect subdomain to root domain when accessed via SSL通过 SSL 访问时将子域重定向到根域
【发布时间】:2015-03-26 19:04:33
【问题描述】:

我想将人们从输入 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

这很好用,除非我在 URL 栏中专门输入 https://www.example.com。这似乎在中间件执行之前通过 SSL 进入我的应用程序。我在浏览器中收到此消息:

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

如何改变这种行为?我正在使用 Heroku 进行生产。有没有我不知道的 GEM 可以做到这一点?

【问题讨论】:

  • 为什么不在 nginx 或 apache 服务器配置中尝试同样的方法。
  • 哦,我应该将此添加到我的帖子中。我正在使用heroku进行生产。有没有办法做到这一点?
  • 我不确定。我没用过。但必须有。

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


【解决方案1】:

您无法更改此行为:浏览器正在尝试连接到 https://www.example.com,但您的证书用于不同的域。此时您的应用程序根本不涉及。

解决这个问题的唯一方法是拥有一个对 www.example.com 和 example.com 都有效的 ssl 证书

【讨论】:

  • 但是像 youtube 这样的网站是如何做到的呢?如果您尝试输入像 youtube.com 这样的 youtube 链接,它会将您重定向到 youtube.com
  • 他们有一个对两个域都有效的证书
猜你喜欢
  • 1970-01-01
  • 2012-11-18
  • 2018-04-08
  • 2016-01-30
  • 2012-07-08
  • 2023-03-27
  • 2013-10-13
  • 2014-09-29
  • 2011-09-17
相关资源
最近更新 更多