从http://example.com重定向到https://example.mysite.com

时间:2012-01-27 01:30:05

标签: redirect ssl https ruby-on-rails-3.1 heroku

这个问题已经在各种排列中被问到,但我找不到能够回答我特定问题的正确组合。

配置

  • Rails 3.1(允许我在force_ssl中使用ApplicationController
  • 在Heroku Cedar上托管(所以我无法触及中间件)
  • 我的SSL证书已注册secure.example.com

我已经将force_ssl添加到我的ApplicationController中,如下所示:

# file: controllers/application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery
  force_ssl
end

问题

目前,如果用户导航到http://example.com,force_ssl会切换到SSL,但由于它不是secure.example.com,因此它会显示有关未经验证的安全证书的警告,因为它使用默认的Heroku证书。

(我已经确认导航到http://secure.example.com正确重定向到https://secure.example.com并使用适当的安全证书。这很好。)

问题

如何强制http://www.example.com/anythinghttp://example.com/anything重定向到http://secure.example.com/anything? (我假设force_ssl将处理从http到https的切换。)因为我无法触摸中间件(回想一下这是Heroku主机),我假设我可以做类似的事情:

# file: controllers/application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery
  force_ssl
  before_filter :force_secure_subdomain

private
  def force_secure_subdomain
    redirect_to(something...) unless request.ssl?
  end
end

...但我还没有充分了解redirect_to和请求对象以了解为something...写些什么。 (我想确保它处理查询参数等。)

2 个答案:

答案 0 :(得分:4)

您可以通过执行以下操作重定向到其他主机名:

# file: controllers/application_controller.rb
class ApplicationController < ActionController::Base
  force_ssl :host => "secure.example.com"
end

请参阅:rails force_ssl source了解更多信息

答案 1 :(得分:0)

你应该看看rack-rewrite - 它本质上是Apache重写,但是以Ruby形式,可以在Heroku上使用。

这将允许您创建各种机架级规则以及应该发生何种重定向等。