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

Vic*_*Lam 20 ssl ruby-on-rails ruby-on-rails-2

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

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

谢谢大家.:)

Sim*_*tti 32

使用机架中间件.

# 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"
Run Code Online (Sandbox Code Playgroud)

  • 正如Simone Carletti所指出的,在rails> = 3.1中,有一个force_ssl方法可用.见http://www.simonecarletti.com/blog/2011/05/configuring-rails-3-https-ssl/ (6认同)
  • Rails 3.0.X中默认不包含`lib/force_ssl.rb`.你需要将这一行添加到`application.rb`:`require File.expand_path('../../ lib/force_ssl.rb',__ FILE __)`或者在别处做一些类似的`require`.另外,`config.middleware.use"ForceSSL"`行应该放在`config/environments/production.rb`中. (2认同)

shi*_*ara 5

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

class Application < AC::Base

  before_filter :need_ssl

  def need_ssl
    redirect_to "https://#{request.host}/#{request.query_string}" unless request.ssl?
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 除非是request.ssl? (4认同)