Rails 3.1 Force Regular HTTP - PullRequest
       13

Rails 3.1 Force Regular HTTP

14 голосов
/ 20 сентября 2011

Раньше я использовал ssl_requirement , чтобы дать нам детальный контроль над тем, какие страницы обслуживались по ssl, а какие - по обычному http.

Согласно собственной вики ssl_requirement, она была заменена на рельсы 3.1 Force SSL . Однако, похоже, это не так. Похоже, что принудительный SSL не предоставляет возможности идти в обратном направлении, нет способа принудительно отправить страницу через обычный http.

Как правильно в Rails 3.1 заставить страницу отображаться в простом http? Действительно ли Force SSL заменяет ssl_requirement?

Ответы [ 6 ]

26 голосов
/ 26 сентября 2011

Что сказал справедливость.Некоторые люди сильно настроены на просмотр с 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
4 голосов
/ 26 сентября 2011

Код для Force SSL довольно легко читается.

https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/force_ssl.rb

Кажется, он не делает обратного и заставляет использовать http.Он предоставляет единственные и исключающие опции для управления тем, для каких действий и контроллеров требуется SSL, но не предоставляет способ принудительного использования HTTP вместо https.

2 голосов
/ 15 октября 2013

Чтобы использовать force_non_ssl точно так же, как и force_ssl, проверьте этот Rails Concern: https://gist.github.com/joost/6989118

Принимает такие параметры, как:

force_non_ssl only: :show
force_non_ssl except: :show, notice: "Hi this is now insecure :)"
1 голос
/ 07 января 2016

Я упростил код 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
0 голосов
/ 21 января 2015

Для тех, кому просто нужно на короткое время отключить поведение force_ssl во всем приложении на локальной машине, такой как я, вы можете просто сделать это в вашем ApplicationController:

def self.force_ssl *a
  warn "force_ssl disabled globally"
end

Просто убедитесь, что нетпередать его в вашу кодовую базу.

0 голосов
/ 26 сентября 2011

Зачем вам когда-либо хотеть форсировать HTTP через HTTPS?

Многие из нас здесь с помощью SSL везде . Пожалуйста, не подвергайте нас риску просто потому, что вам не нравится помогать нам с нашей собственной безопасностью.

Для большинства из нас безопасность важна , даже если большинство из нас не понимает ее важности или не знает, как ее получить. Для некоторых из нас безопасность является критической для жизни и смерти .

Некоторые страницы должны обслуживаться через SSL. Хотя, на мой взгляд, если любая часть вашего сайта требует обслуживания по SSL, то для сайта весь это требуется (MITM может изменить ссылку на страницу SSL в том виде, как она есть). отображается на странице без SSL, чтобы указать на не-SSL прокси, который контролирует MITM). Никакая страница когда-либо не требует обслуживания с out SSL.

...