使用force_ssl时设计重定向到不同的资源

时间:2013-03-01 17:33:04

标签: devise ruby-on-rails-3.2

我为整个应用程序启用了force_ssl,并使用Devise进行身份验证。但是在生产中,当我尝试访问http设备路径时,例如http://domain.com/users/sign_in,然后我被重定向到路径的https版本,但使用不同的资源,例如https://domain.com/admins/sign_in

这似乎取决于routes.rb中给出资源的顺序。所以,例如,如果我有:

devise_for :users
devise_for :admins

然后访问http://domain.com/admins/sign_in将重定向到https://domain.com/users/sign_in,而http://domain.com/users/sign_in将保留正确的资源并重定向到https://domain.com/users/sign_in

如果我改变routes.rb中资源的顺序,那么情况正好相反。

我在我的应用程序控制器中实现了一个非常轻微的自定义版本force_ssl,以便以后能够将某些控制器操作指定为例外。

class ApplicationController < ActionController::Base
include ApplicationHelper
protect_from_forgery

#Re-implement force_ssl to allow override in controllers
def self.force_ssl(options = {})
 host = options.delete(:host)
 before_filter(options) do
  if !request.ssl? && !Rails.env.development? && !(respond_to?(:allow_http?) && allow_http?)
    redirect_options = {:protocol => 'https://', :status => :moved_permanently}
    redirect_options.merge!(:host => host) if host
    redirect_options.merge!(:params => request.query_parameters)
    redirect_to redirect_options
  end
 end
end

force_ssl
end

如何确保在从http到https?

的重定向中维护设计资源

由于

0 个答案:

没有答案