我为整个应用程序启用了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?
的重定向中维护设计资源由于