假设(希望)您已升级到受支持的 Rails 版本,这是实现默认非 SSL 的一种简单方法,除非声明了 force_ssl。它的形式是ActiveSupport::Concern:
module ForceNoSSL
extend ActiveSupport::Concern
ACTION_OPTIONS = [:only, :except, :if, :unless]
def force_no_ssl_redirect
if request.ssl?
options = {
:protocol => 'http://',
:host => request.host,
:path => request.fullpath,
:status => :moved_permanently
}
redirect_to ActionDispatch::Http::URL.url_for(options)
end
end
class_methods do
def force_ssl(options = {})
super
action_options = options.slice(*ACTION_OPTIONS)
skip_before_action :force_no_ssl_redirect, **action_options
end
def force_no_ssl
before_action :force_no_ssl_redirect
end
end
end
然后在你的ApplicationController你:
include ForceNoSSL
force_no_ssl
它的工作原理是默认情况下所有操作都将运行force_no_ssl_redirect 回调。如果已经是非ssl连接则什么都不做,否则请求会被重定向到http://。
但是,如果您已声明 force_ssl,则将跳过 force_no_ssl_redirect 回调(仅适用于 ACTION_OPTIONS 指定的那些操作)。
您可以扩展它以允许 force_no_ssl 接受 URL 选项等...就像 force_ssl 操作一样,但对于我的用例来说,这不是必需的。
附:很多代码来自ActionController::ForceSSL,因此请查看以获取更多信息。