将排除选项传递给Rack :: SSL

时间:2012-10-29 22:57:50

标签: ruby-on-rails-3 ssl rack

遵循针对Rails 3.2.x更新的指导here,我希望只有在包含https://前缀时才能配置Rack :: SSL才能使用SSL过滤器:

config.force_ssl = true
config.ssl_options = { :exclude => proc { |env| puts 'here? ' + env.to_s; env['HTTPS'] != 'on' } }

但是,https有效,http失败并出现以下错误:

[2012-10-29 15:37:03] ERROR OpenSSL::SSL::SSLError: SSL_accept returned=1 errno=0 state=SSLv2/v3 read client hello A: http request
    /Users/user/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/openssl/ssl-internal.rb:164:in `accept'

不执行插入lambda的诊断代码。如何在Rails 3.2.x中配置Rack:SSL以响应HTTP和HTTPS?

Rails 3.2.8,使用自签名证书为SSL配置WEBrick。

3 个答案:

答案 0 :(得分:2)

自2012年5月起,exclude哈希中使用options选项的功能已被删除,原因如下:https://github.com/rails/rails/pull/5515

我看到的错误是红鲱鱼。 exclude被忽略,http://请求被重定向到ActionDispatch::SSLhttps://。然后OpenSSL因为协议不匹配而窒息(我假设)。

解决方案是使用rack-ssl gem,如建议here。这与ActionDispatch :: SSL基本相同,只是仍然遵守exclude选项。

答案 1 :(得分:2)

rack-ssl类似的方法是使用rack-ssl-enforcer,配置如下:

# config/environments/production.rb
config.middleware.use Rack::SslEnforcer, :except => ['/heatlh_check', %r{^/public/}]

答案 2 :(得分:0)

经过几天的摔跤与配置等,我发现了这个伟大的宝石:

https://github.com/lserman/aws-healthcheck

无需任何自定义nginx设置(通过机架工作)。它在/ healthcheck上返回200,就像魅力一样。只需将它添加到您的宝石中即可完成。