【问题标题】:Rails 3: Forcing HTTP in some parts, and Forcing HTTPS in others?Rails 3:在某些部分强制使用 HTTP,在其他部分强制使用 HTTPS?
【发布时间】:2013-08-29 18:42:15
【问题描述】:

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

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

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

【问题讨论】:

    标签: ruby-on-rails routes


    【解决方案1】:

    不确定此博客是否对您有用: 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 
    

    希望对你有帮助

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 如何只在特定的控制器方法中实现?
      猜你喜欢
      • 2011-03-19
      • 2014-01-22
      • 2017-06-05
      • 2015-06-22
      • 2012-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-14
      相关资源
      最近更新 更多