Использовать SSL для определенных маршрутов в Rails 3.1
Мне нужно принудительно SSL на всех маршрутах в моем приложении, кроме landing#index
.
В config/application.rb
у меня есть:
config.force_ssl = true
Тогда в landing_controller.rb
у меня есть:
force_ssl :except => :index
Однако все маршруты по-прежнему перенаправляются на https
.
Кто-нибудь знает, как условно принудительно использовать SSL в приложении Rails 3.1+?
Решение:
Добавьте в свой Gemfile
следующее:
gem 'rack-ssl-enforcer'
Добавьте в свой config/application.rb
следующее:
config.middleware.use Rack::SslEnforcer, :except => [ /\/$/ ], :strict => true
Ответы
Ответ 1
Я задал аналогичный вопрос о stackoverflow здесь и ему сказали использовать https://github.com/tobmatth/rack-ssl-enforcer. Я еще не пробовал это, но, основываясь на readme, он, по-видимому, решает вашу проблему условного применения ssl на определенных маршрутах.
Ответ 2
Rails 4 с ActiveAdmin 1.0b, я изменил config/initializers/active_admin.rb:
config.before_filter :force_ssl_redirect, if: :https_enabled?
force_ssl_redirect
определяется в actionpack/lib/action_controller/metal/force_ssl.rb и является тем, что вызывает метод класса Rails force_ssl
.
https_enabled?
, определенный в моем приложении application_controller.rb:
def https_enabled?
ENV['HTTPS_ENABLED'] == 'true'
end
Ответ 3
Вы можете сделать это следующим образом:
контроллер
force_ssl :except => :index
вид
Предположим, что имя вашего указателя index_landing_path
<%= link_to 'Landing', index_landing_path, :protocol => 'http' %>