Rails 3.1强制常规HTTP

以前,我一直在使用ssl_requirement来对我们在ssl上提供服务的页面进行细粒度控制,并通过普通的http提供服务。

根据ssl_requirement自己的wiki,它已被rails 3.1的Force SSL 取代 。 然而,情况似乎并非如此。 强制SSL似乎没有暴露出相反方向的选项,没有办法强制页面通过常规http发送。

什么是正确的Rails 3.1方式强制页面以纯http显示? Force SSL真的取代了ssl_requirement吗?

Force SSL的代码非常容易阅读。

https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/force_ssl.rb

它似乎没有反向并强制使用http。 它提供了唯一的和except选项来控制需要SSL的操作和控制器,但是没有提供强制使用HTTP而不是https的方法。

什么正义说。 有些人强烈建议使用SSL浏览所有内容。 现在窥探非SSL会话是微不足道的,因此您应该尽量避开想要使用它的人。

然而。

使用before_filter完成它应该相当容易:

class ApplicationController < ActionController::Base before_filter do if request.ssl? && Rails.env.production? redirect_to :protocol => 'http://', :status => :moved_permanently end end end 

要使用force_non_sslforce_non_ssl完全相同, force_ssl检查此Rails关注: https : force_ssl

接受以下选项:

 force_non_ssl only: :show force_non_ssl except: :show, notice: "Hi this is now insecure :)" 

我将joost的代码简化为我需要的所有代码。 谢谢joost

 if request.ssl? options = { :protocol => 'http://', :host => request.host, :path => request.fullpath, :status => :moved_permanently } non_secure_url = ActionDispatch::Http::URL.url_for(options.slice(*URL_OPTIONS)) redirect_to non_secure_url, options.slice(*REDIRECT_OPTIONS) end 

对于那些只需要在像我这样的本地机器上短时间在整个应用程序上禁用force_ssl行为的人,您可以在ApplicationController中执行此操作:

 def self.force_ssl *a warn "force_ssl disabled globally" end 

请确保不要将其提交给您的代码库。

为什么要通过HTTPS强制HTTP?

我们这里的很多人到处浏览SSL。 请不要仅仅因为你不喜欢用我们自己的安全来帮助我们而让我们其他人处于危险之中。

对于我们大多数人来说,即使我们大多数人不了解其重要性或知道如何获得安全性,安全也很重要 。 对我们中的一些人来说,安全是生死攸关的关键

某些页面必须通过SSL提供。 虽然,在我看来,如果您的网站的任何部分需要通过SSL提供,那么整个网站都需要它(MITM可以更改指向SSL页面的链接,因为它在非SSL页面上呈现为指向非 – MITM控制的-SSL代理)。 没有页面需要使用SSL服务。