4

私は次のルートを持っています:

resources :widgets do
  resources :orders
end

たとえば、/widgets/1/orders/new注文がOrderControllerに送信され、OrderControllerparams[:widget_id]は、購入されているウィジェットを知るためにアクセスできます。

問題はこれです:私force_sslはOrderControllerで使用します。これにより、次のリクエストが発生します。

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

リダイレクトされる(302):

https://www.example.com/

言い換えると、force_sslはその役割を果たしています(URLのhttpsプロトコルバージョンにリダイレクトしています)が、プロセス内のルートの動的セグメントによって指定されたパラメーターを破棄しています。どうすればこれが発生するのを防ぐことができますか(望ましい)、または最も不快な方法で回避できますか?

これはHerokuでホストされているため、たとえばApacheリダイレクトは機能しないことに注意してください。

4

1 に答える 1

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
于 2011-11-07T03:51:42.683 に答える