4

У меня есть следующий маршрут:Как предотвратить force_ssl от уничтожения параметров при перенаправлении?

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 делает свою работу (перенаправление на HTTPS версию протокола URL), но разрушает параметры, заданные динамическим сегментом маршрута в процессе. Как я могу предотвратить это (предпочтительнее) или обойти его наименее оскорбительным способом?

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

ответ

3

Я считаю, что поведение по умолчанию 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 
+0

Спасибо за этот ответ. К сожалению, с тех пор я развертывал приложение с SSL, которое было принудительно запущено во всем приложении (то есть «config.force_ssl = true» в config/environment/production.rb) как обходное решение, отличное от идеального. Поскольку я не могу легко проверить это, не делая этого на моем рабочем сервере, я не могу сказать, работает ли ваше решение или нет. : - \ – niemand

+0

Работает для меня, спасибо! Вы создали запрос на растяжение? – jankubr

+0

Спасибо! Ты действительно спас меня! – Pabloks