Принудительное использование SSL с помощью ssl_requirement в приложении Rails 2 - PullRequest
20 голосов
/ 05 октября 2010

У меня есть приложение Rails, которое должно работать под SSL.Я попытался ssl_requirement, но, похоже, мне нужно ввести все действия на каждом контроллере.

Есть ли способ, которым я могу добавить before_filter в контроллере приложения с ssl_requirement, чтобы приложения автоматически перенаправлялись на https, когда пользовательЗапрос в http?

Спасибо всем.:)

Ответы [ 3 ]

32 голосов
/ 05 октября 2010

Используйте промежуточное программное обеспечение для стойки .

# 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"
5 голосов
/ 05 октября 2010

Вы можете попробовать проверить, находится ли запрос в 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
1 голос
/ 07 декабря 2011

Ключевая проблема заключается в том, что force_ssl.rb не загружается и что lib не загружается по умолчанию в rails 3.1. Вы должны добавить

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

до application.rb

...