我正在运行一个需要让一些页面使用force_ssl的Rails 3.1.4应用程序,但是其他一些我不想拥有SSL的应用程序。是否与force_ssl相反,如force_http?问题是我有一些页面不需要是SSL,它们包含我无法使用https接收的元素(因此用户从浏览器中获取不安全的错误)。
当有人进入force_ssl页面时,它可以正常工作,但是当他们转到其他不是force_ssl的页面时,他们会从浏览器收到不安全的页面错误,因为https仍然存在。因此,我想强制我不能使用https的页面避免使用SSL(即强制它回到http)。
提前谢谢。
答案 0 :(得分:5)
好的,我找到了一种似乎对我有用的方法:
在我的会话控制器中,我添加了这个:
force_ssl :only => [:new, :create]
因此,只有那两个动作才能通过SSL调用。现在,用户成功登录后,页面将重定向到非SSL连接。
至于强制页面为非SSL,请尝试以下问题:Rails 3.1 Force Regular HTTP,使用before_filter查找Joost的答案。
这是他发布的内容:
class ApplicationController < ActionController::Base
before_filter do
if request.ssl && Rails.env.production?
redirect_to :protocol => 'http://', :status => :moved_permanently
end
end
end
免责声明:上面的代码不是我的,我从链接中的问题复制了它,只是为了方便起见。请访问上面的链接,在原始背景下查看。
另外,关于强制非SSL,我不确定这是个好主意。如果用户请求SSL连接并且您拥有证书,为什么不给它们?我同意SSL确实给浏览器带来了更大的压力,但是有些人总是喜欢在SSL上冲浪。如果您有一些代码不能通过SSL工作,那么这是强制非SSL的正当理由。
干杯。
答案 1 :(得分:0)
没有循环就可以使用它。除非它在浏览器中发生,否则我不知道。
before_filter do
unless params[:controller] == 'whatever_controller_name_you_are_serving_https_to'
if request.ssl? && Rails.env.production?
redirect_to :protocol => 'http://', :status => :moved_permanently
end
end
end
答案 2 :(得分:0)
假设(希望)您已升级到受支持的Rails版本,除非声明force_ssl
,否则这是实现默认非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
接受网址选项等...就像force_ssl
操作一样,但对于我的用例,这不是必需的。
P.S。很多代码来自ActionController::ForceSSL
,因此请查看以获取更多信息。