WEBrick& Sinatra:如何将所有http流量重定向到https

时间:2015-01-03 02:46:02

标签: ruby redirect https sinatra webrick

我试图建立一个非常简单的Sinatra和Webrick服务器,使用自签名证书在https上工作。我想将所有http流量重定向到https,这可能在此设置中吗?

我有两个Ruby文件如下:

sinatra_ssl.rb

#sinatra_ssl.rb
require 'webrick/https'

module Sinatra
  class Application
    def self.run!
      certificate_content = File.open(ssl_certificate).read
      key_content = File.open(ssl_key).read

      server_options = {
        :Host => bind,
        :Port => port,
        :SSLEnable => true,
        :SSLCertificate => OpenSSL::X509::Certificate.new(certificate_content),
        :SSLPrivateKey => OpenSSL::PKey::RSA.new(key_content)
      }

      Rack::Handler::WEBrick.run self, server_options do |server|
        [:INT, :TERM].each { |sig| trap(sig) { server.stop } }
        server.threaded = settings.threaded if server.respond_to? :threaded=
        set :running, true
      end
    end
  end
end

编辑:增加了rack / ssl的要求 myapp.rb

    #myapp.rb
    require 'sinatra'
    require 'path/to/sinatra_ssl'
    require 'rack/ssl'

    use Rack::SSL

    set :server, 'WEBrick'
    set :ssl_certificate, "path/to/server.crt"
    set :ssl_key, "path/to/server.key"
    set :port, 8443

    get '/' do
        'Hello World!'
    end

目前,如果我访问https://localhost:8443,我会收到Hello World!消息,但如果我访问http://localhost:8443,我会收到ERR_EMPTY_RESPONSE,因为服务器没有路由。

有没有办法进行此重定向?

2 个答案:

答案 0 :(得分:2)

您是否可以考虑将中间件rack-ssl用于此任务?如果那么试试这个:

require 'rack/ssl'
use Rack::SSL

答案 1 :(得分:0)

如果您不想在本地环境中通过rack-ssl强制执行SSL,那么您可以在config.ru中测试环境并相应地激活它:

require 'rack/ssl'

if ENV['RACK_ENV'] == 'production'
   use Rack::SSL
end