生产中的force_ssl.rb - 如何在控制器中覆盖只是http

时间:2014-09-10 16:56:25

标签: ruby-on-rails ruby-on-rails-3.2

在我的production.rb中,我有

  config.force_ssl = true

并希望提供例外情况。看起来这应该有效(找不到如何回到3.2.19):

class ApiItemsController < ApplicationController

  force_ssl except: :get_item_test

但事实并非如此。我见过Rails 3.2 force_ssl except on landing page,但实际上并不想为这样一件微不足道的事情添加宝石。我如何让它工作?


编辑1

enter image description here

2 个答案:

答案 0 :(得分:2)

您将无法使用config.force_ssl = true制作专门的例外,因为Rails使用rack-ssl来设置Strict-Transport-Security header。您可能不希望为着陆页禁用此功能,无论如何,Google now uses this as a ranking signal

答案 1 :(得分:2)

@ brad-werth完全正确,HTS标题使你可能不想这样做。但我仍然想要这样做,所以这就是我所学到的:

On Rails 5(根据ActionDispatch::SSL docs):

config.ssl_options = { redirect: { exclude: -> request { request.path =~ /health_check/ } } }

在Rails 4(以及一些Rails 3版本)中,您必须使用单独的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支持like this

config.ssl_options = { exclude: proc { |env| env['PATH_INFO'].start_with?('/health_check')} }

要回答实际提出的问题,环境中的config.force_ssl设置为quite different,而不是在控制器中使用force_ssl,并且无法以这种方式覆盖。