Rails 3:在某些部分强制使用HTTP,在其他部分强制使用HTTPS?

时间:2013-08-29 18:42:15

标签: ruby-on-rails routes

我目前正试图找到一种方法来强制某些路由的http(更快,不需要安全性)并强制https用于更敏感的页面。我看到了答案:Rails 3 SSL Deprecation,但它似乎不起作用。

我在根网址周围添加了一个范围:

scope :constraints => { :protocol => 'http' } do
  root :to => 'site#index'
end

但是当我尝试访问localhost:3000时,它只是抛出错误No route matches [GET] "/"

是否有一种干净的方法可以在某些地方强制使用http并在其他地方强制使用https(我可以在我的控制器中使用force_ssl,但是有force_http吗?)路线周围的范围看起来干净,但它不适合我。我做错了吗?

这样的方法怎么样?

CONTROLLERS_THAT_REQUIRE_SSL = ['check_out']
def ensure_proper_protocol
  unless Rails.env.development? || Rails.env.test?
    if request.protocol["https"] && !CONTROLLERS_THAT_REQUIRE_SSL.include?(params[:controller])
      redirect_to "http://" + request.host + request.path
    end
  end
end

2 个答案:

答案 0 :(得分:0)

不确定此博客是否对您有用: Always-On HTTPS With Rails Behind an ELB 这也可能对您有用,因为您正在尝试强制使用https的某些部分。 SSL Requirement。它在有关SSL要求的部分详细说明了添加声明性方法,指定某些操作应仅允许在SSL下运行。如果要在SSL中指定整个控制器,请调用ssl_exceptions

或者,您可以尝试通过执行类似

的操作来编写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 

希望这有帮助

答案 1 :(得分:0)

在寻找答案之后,它看起来并不存在,所以我创建了一个force_http宝石......这是我的第一个宝石,我没有真正测试它,但看看是否你们中任何一个人都面临同样的问题:

使用gem install force_http安装,或者您可以在此处找到它:https://github.com/EdmundMai/force_http。您只需将force_http放在控制器中,就像使用force_ssl一样。它基本上恰恰相反。我查看了源代码,并将其配置为在request.ssl时重定向到http://而不是https://