Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何防止强制ssl破坏重定向中的参数?_Ruby On Rails_Routes_Ruby On Rails 3.1_Actioncontroller - Fatal编程技术网

Ruby on rails 如何防止强制ssl破坏重定向中的参数?

Ruby on rails 如何防止强制ssl破坏重定向中的参数?,ruby-on-rails,routes,ruby-on-rails-3.1,actioncontroller,Ruby On Rails,Routes,Ruby On Rails 3.1,Actioncontroller,我有以下路线: resources :widgets do resources :orders end 因此,向OrderController发出请求(例如,向/widgets/1/orders/new),OrderController可以访问参数[:widget_id],以了解正在购买的小部件 问题在于:我在OrderController中使用了强制ssl。这导致以下请求: http://www.example.com/widgets/1/orders/new 要重定向(302)到:

我有以下路线:

resources :widgets do
  resources :orders
end
因此,向OrderController发出请求(例如,向
/widgets/1/orders/new
),OrderController可以访问
参数[:widget_id]
,以了解正在购买的小部件

问题在于:我在OrderController中使用了
强制ssl
。这导致以下请求:

http://www.example.com/widgets/1/orders/new
要重定向(302)到:

换句话说,force_ssl正在完成它的工作(重定向到https协议版本的URL),但正在破坏过程中路由的动态段指定的参数。我如何防止这种情况发生(最好)或以最不冒犯的方式解决它


请注意,这是托管在Heroku上的,因此,例如Apache重定向对我不起作用。

我相信强制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

谢谢你的回答。不幸的是,我在整个应用程序(即config/environments/production.rb中的
config.force\u SSL=true
中)部署了应用程序并强制使用SSL,作为一种不太理想的解决方法。因为如果不在我的生产服务器上进行测试,我就无法轻松地进行测试,所以我无法判断您的解决方案是否有效:-\对我有用,谢谢!您是否为此创建了拉取请求?谢谢!你真的救了我!我没有提交拉取请求。我没有测试这个补丁很多,可能有错误。此解决方案可能存在的一个问题是,当您收到一个POST时,重定向将作为带有参数的GET。
#
# 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