如何根据域名有条件地强制SSL?

时间:2014-03-13 21:41:06

标签: ruby-on-rails ssl https ruby-on-rails-4 routes

我的Rails应用程序有两个域名:app.example.com,short.net。较长的域是标准域并且需要HTTPS,较短的域是用于提供短URL并且需要HTTP的便利域。

目前我正在强制使用SSL:

config.force_ssl = true

但我真的只想为更长的域名强制使用SSL。我如何根据域名有条件地强制使用SSL?短域名将重定向到主域名,然后强制使用SSL。这将避免要求短域名的SSL证书。

思想?

3 个答案:

答案 0 :(得分:13)

ApplicationController添加一些配置:

class ApplicationController < ActionController::Base
   force_ssl if: :ssl_required?

   [...]

   private
   def ssl_required?
     request.host == 'app.example.com'
   end
end

来源:http://api.rubyonrails.org/classes/ActionController/ForceSSL/ClassMethods.html

答案 1 :(得分:1)

class ApplicationController < ActionController::Base
  force_ssl if: :force_ssl?

private

  def force_ssl?
    if Rails.env.production? || Rails.env.staging?
      return request.host != CONFIG[:short_host]
    end
    return false
  end
end

答案 2 :(得分:0)

在Rails 5和更高版本中,您可以并且应该通过ssh_options执行此操作,因为force_ssl在Rails 6.0的控制器中已弃用,并将在6.1中删除。

config.force_ssl = true
config.ssl_options = {
  redirect: {
    exclude: ->(request) { request.host == 'app.example.com' }
  }
}