Ruby on rails production.rb中的强制ssl-如何在控制器中重写为http

Ruby on rails production.rb中的强制ssl-如何在控制器中重写为http,ruby-on-rails,ruby-on-rails-3.2,Ruby On Rails,Ruby On Rails 3.2,在我的production.rb中,我有 config.force_ssl = true 并希望提供例外情况。看起来这应该是可行的(找不到如何返回到3.2.19): class apitemscontroller

在我的production.rb中,我有

  config.force_ssl = true
并希望提供例外情况。看起来这应该是可行的(找不到如何返回到3.2.19):

class apitemscontroller
但事实并非如此。我见过,但我真的不想为这样一件小事添油加醋。我怎样才能让它工作


编辑1

您将无法使用
config.force\u ssl=true
创建专门的异常,因为Rails使用,这将设置。无论如何,您可能不想对登录页禁用此功能,因为。

@brad werth完全正确,HTS标头使这成为您可能不想做的事情。但我一直想这样做,所以我学到了以下几点:

在轨道5上(根据图纸):

在Rails4(和一些Rails3版本)中,您必须使用单独的gem。或者,如果可以在中间件中执行所需操作,您可以尝试以下操作:

# config/environments/production.rb
config.middleware.insert_before 'ActionDispatch::SSL', 'HealthCheck'

# app/middleware/health_check.rb
class HealthCheck
  def initialize(app)
    @app = app
  end
  def call(env)
    if env['REQUEST_PATH'] == '/health_check'
      return [200, {}, []]
    else
      @app.call(env)
    end
  end
end
据报道,Rails 3的某些版本支持以下内容:


要回答实际提出的问题,环境中的
config.force_ssl
设置来自于在控制器中使用
force_ssl
,不能以这种方式覆盖。

@timpon不是
config.force_ssl=true
的“简单方法”。您可以将非TLS页面放在自己的子域上,或者只是拼凑出自己的解决方案。机架ssl的代码非常简单()。问题是,严格的传输安全头非常好。出于好奇,为什么要禁用它呢?您指出的gem可能是一个很好的解决方案,但是如果您丢失了严格的传输安全头,我猜(我没有尝试过)您也将无法在安全页面和非页面之间共享cookie,除非您完全禁用安全cookie(这不是一个很好的计划)。我不知道这对你是否重要。如果是我,而且在技术上似乎是可行的,我会回击非TLS要求。好吧——回答更长——我们托管在heroku上,很明显,他们在管理ssl端点方面做了一些不正确的事情,因为我们已经看到了两个被破坏的https(无效证书)实例。客户机可能有问题,但不确定。就我们的应用程序而言,我们有一个需要auth的部分,我希望它能通过https运行,但我们还有一个部分是加载到客户站点上的自定义javascript文件。正如你所能想象的,heroku没有为后者提供服务。其中一个客户端在访问heroku的管理部分时出错(见上文编辑部分)。不共享cookies就可以了。非常担心heroku的错误,但昨晚没有时间看更多。
config.ssl_options = { redirect: { exclude: -> request { request.path =~ /health_check/ } } }
# config/environments/production.rb
config.middleware.insert_before 'ActionDispatch::SSL', 'HealthCheck'

# app/middleware/health_check.rb
class HealthCheck
  def initialize(app)
    @app = app
  end
  def call(env)
    if env['REQUEST_PATH'] == '/health_check'
      return [200, {}, []]
    else
      @app.call(env)
    end
  end
end
config.ssl_options = { exclude: proc { |env| env['PATH_INFO'].start_with?('/health_check')} }