在Rails中与Force_SSL相反?

时间:2012-05-15 19:12:38

标签: ruby-on-rails-3 ssl

我正在运行一个需要让一些页面使用force_ssl的Rails 3.1.4应用程序,但是其他一些我不想拥有SSL的应用程序。是否与force_ssl相反,如force_http?问题是我有一些页面不需要是SSL,它们包含我无法使用https接收的元素(因此用户从浏览器中获取不安全的错误)。

当有人进入force_ssl页面时,它可以正常工作,但是当他们转到其他不是force_ssl的页面时,他们会从浏览器收到不安全的页面错误,因为https仍然存在。因此,我想强制我不能使用https的页面避免使用SSL(即强制它回到http)。

提前谢谢。

3 个答案:

答案 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,因此请查看以获取更多信息。