在我的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,但实际上并不想为这样一件微不足道的事情添加宝石。我如何让它工作?
答案 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
,并且无法以这种方式覆盖。