Принудительное использование SSL с помощью ssl_requirement в приложении Rails 2
У меня есть приложение Rails, которое должно работать под SSL. Я попытался ssl_requirement, но, похоже, мне нужно ввести все действия на каждом контроллере.
Можно ли добавить метод before_filter в контроллер приложений с помощью ssl_requirement, чтобы приложения автоматически перенаправляли на https, когда пользовательский запрос находится в http?
Спасибо всем.:)
3 ответа
Решение
Используйте промежуточное программное обеспечение стойки.
# 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"
Вы можете попробовать проверить, находится ли запрос в 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
Ключевая проблема заключается в том, что force_ssl.rb не загружается и что lib не загружается по умолчанию в rails 3.1. Вы должны добавить
config.autoload_paths += %W(#{config.root}/lib)
config.autoload_paths += Dir["#{config.root}/lib/**/"]
в application.rb