force_ssl
假设(希望)您已升级到受支持的 Rails 版本,除非声明,否则这是实现默认非 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
操作一样,但对于我的用例来说,这不是必需的。
PS 很多代码都来自于此,ActionController::ForceSSL
因此请查看以获取更多信息。