在Rails 2应用程序中使用ssl_requirement强制SSL

时间:2010-10-05 07:51:45

标签: ruby-on-rails ssl ruby-on-rails-2

我有一个需要在SSL下运行的Rails应用程序。我尝试了ssl_requirement,但似乎我必须输入每个控制器中的所有动作。

是否有任何方法可以在应用程序控制器中使用ssl_requirement添加before_filter,以便当用户请求在http时,应用程序将自动重定向到https?

谢谢大家。 :)

3 个答案:

答案 0 :(得分:32)

使用Rack Middleware

# lib/force_ssl.rb
class ForceSSL
  def initialize(app)
    @app = app
  end

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

# config/environment.rb
config.middleware.use "ForceSSL"

答案 1 :(得分:5)

您可以在应用程序的before_filter中尝试测试请求是否在ssl中

class Application < AC::Base

  before_filter :need_ssl

  def need_ssl
    redirect_to "https://#{request.host}/#{request.query_string}" unless request.ssl?
  end
end

答案 2 :(得分:1)

关键问题是没有加载force_ssl.rb,默认情况下在rails 3.1中没有加载lib。你必须添加

config.autoload_paths += %W(#{config.root}/lib)
config.autoload_paths += Dir["#{config.root}/lib/**/"]

application.rb