Ruby 韦德里克;Sinatra:如何将所有http流量重定向到https

Ruby 韦德里克;Sinatra:如何将所有http流量重定向到https,ruby,redirect,https,sinatra,webrick,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_ce

我曾尝试设置一个非常简单的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
    #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
编辑:增加了机架/ssl的要求 myapp.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
    #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
我得到了
你好世界消息,但如果我访问
http://localhost:8443
我得到一个
ERR\u EMPTY\u响应
,因为服务器没有路由


有没有办法做这种重定向?

你能考虑使用中间件来完成任务吗?如果需要,请尝试以下操作:

require 'rack/ssl'
use Rack::SSL

如果您不希望在本地环境中通过机架SSL强制实施SSL,则可以在config.ru中测试环境并相应地激活它:

require 'rack/ssl'

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

我已经添加了这个,但是当我尝试通过http访问localhost时,仍然会得到ERR_EMPTY_响应,我想要的是将它重定向到一个https调用,在这个调用中一切正常。我不知道如何部署应用程序,但我通常会将它们部署在像nginx这样的反向代理之后,在那里您可以轻松地将所有http流量重定向到https@Sirl33tname谢谢我可能最终会这样做,但我现在只是在本地测试,并想知道是否可以直接使用WEBricks