Rails 3.1 Force Regular HTTP
Раньше я использовал ssl_requirement, чтобы дать нам тонкий контроль над тем, какие страницы были обработаны через ssl и которые были отправлены на простой HTTP.
Согласно собственной вики ssl_requirement, она была заменена на rails 3.1 Force SSL. Однако, похоже, это не так. Force SSL, похоже, не предоставляет возможность перейти в противоположном направлении, нет способа заставить страницу отправлять через обычный http.
Каков правильный способ Rails 3.1, чтобы заставить страницу отображаться в обычном http? Действительно ли Force SSL действительно заменяет ssl_requirement?
Ответы
Ответ 1
Код для Force SSL довольно легко читается.
https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/force_ssl.rb
Кажется, что нет обратного и принудительного использования http. Он предоставляет единственные и исключающие опции для управления действиями и контроллерами SSL, но не предоставляет способ принудительного использования HTTP вместо https.
Ответ 2
Что сказал судья. Некоторые люди очень сильно относятся к просмотру с помощью SSL для всего. Теперь тривиально отслеживать сеансы без SSL, поэтому вы должны уйти с пути, чтобы разместить людей, которые хотят его использовать.
Однако.
Это должно быть довольно легко выполнить с использованием файла before_filter:
class ApplicationController < ActionController::Base
before_filter do
if request.ssl? && Rails.env.production?
redirect_to :protocol => 'http://', :status => :moved_permanently
end
end
end
Ответ 3
Чтобы использовать force_non_ssl
точно так же, как force_ssl
, проверьте этот Консоль Rails: https://gist.github.com/joost/6989118
Принимает такие параметры, как:
force_non_ssl only: :show
force_non_ssl except: :show, notice: "Hi this is now insecure :)"
Ответ 4
Я упростил код Joost ко всему, что мне нужно. Спасибо joost
if request.ssl?
options = {
:protocol => 'http://',
:host => request.host,
:path => request.fullpath,
:status => :moved_permanently
}
non_secure_url = ActionDispatch::Http::URL.url_for(options.slice(*URL_OPTIONS))
redirect_to non_secure_url, options.slice(*REDIRECT_OPTIONS)
end
Ответ 5
Для тех, кому просто нужно отключить поведение force_ssl
для всего своего приложения в течение короткого времени на локальном компьютере, таком как я, вы можете просто сделать это в своем ApplicationController:
def self.force_ssl *a
warn "force_ssl disabled globally"
end
Просто не забудьте передать его на свою кодовую базу.
Ответ 6
Зачем вам когда-либо пытаться заставить HTTP по HTTPS?
Многие из нас просматривают SSL везде. Пожалуйста, не ставьте всех нас на риск просто потому, что вам не нравится помогать нам с нашей собственной безопасностью.
Для большинства из нас важна безопасность, даже если большинство из нас не понимает ее важности или не знает, как ее получить. Для некоторых из нас безопасность - это критическая ситуация и смерть.
Некоторые страницы должны обслуживаться через SSL. Хотя, на мой взгляд, если какая-либо часть вашего сайта требует обслуживания через SSL, то весь сайт требует его (MITM может изменить ссылку на страницу SSL, поскольку она отображается на странице без SSL, чтобы указать на не-SSL-адрес -SSL, который контролирует MITM). Ни одна страница никогда не должна обслуживаться с помощью out SSL.