Как предотвратить Force_ssl от уничтожения параметров в редиректе? - PullRequest
4 голосов
/ 12 октября 2011

У меня есть следующий маршрут:

resources :widgets do
  resources :orders
end

так, чтобы запрос, например, на /widgets/1/orders/new переходит к OrderController, который может получить доступ к params[:widget_id], чтобы узнать, какой виджет приобретается.

Проблема заключается в следующем: я использую force_ssl в OrderController. Это вызывает запросы на:

http://www.example.com/widgets/1/orders/new

для перенаправления (302) на:

https://www.example.com/

Другими словами, force_ssl выполняет свою работу (перенаправляет на версию URL протокола https), но уничтожает параметры, указанные динамическим сегментом маршрута в процессе. Как я могу предотвратить это (предпочтительно) или обойти это наименее оскорбительным образом?

Обратите внимание, что это размещено на Heroku, и, например, перенаправление Apache не будет работать для меня.

1 Ответ

3 голосов
/ 07 ноября 2011

Я считаю, что стандартное поведение force_ssl заключается в передаче параметров из незащищенного соединения в защищенное соединение.Если это не то поведение, которое вам нужно, вы можете попробовать переопределить функцию force_ssl, добавив такой инициализатор:

#
# Pass parameters in SSL redirects
#
module ActionController
  module ForceSSL
    module ClassMethods
      def force_ssl(options = {})
        host = options.delete(:host)
        before_filter(options) do
          if !request.ssl? && !Rails.env.development?

            secure_params = request.params.clone
            [:only, :except, :protocol, :status, :host].each {|s| secure_params.delete(s)}

            redirect_options = {:protocol => 'https://', :status => :moved_permanently}
            redirect_options.merge!(:host => host) if host
            redirect_to redirect_options.merge(secure_params)
          end
        end

      end
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...