我只能使用乘客2.2.9,nginx 0.7.65和sinatra 0.94来服务https吗?

我试图部署一个网站只有https访问,没有http访问。 我确信我只是在configuration文件中丢失了一些简单的行。

正如标题所说,这是在nginx 0.7.65到乘客2.2.9上的Sinatra 0.9.4。

Sinatra服务的主要ruby文件有:

require 'ssl_requirement' def ssl_required? true end 

config.ru有(虽然我不知道它是相关的):

 require 'rubygems' require 'sinatra' require 'app.rb' set :environment, :production run Sinatra::Application 

nginx.conf文件如下所示:

  worker_processes 1; events { worker_connections 1024; } http { passenger_root /var/lib/gems/1.8/gems/passenger-2.2.9; passenger_ruby /usr/bin/ruby1.8; include mime.types; default_type application/octet-stream; # HTTPS server # server { listen 80; listen 443; server_name an.internal.ip.address; root /my/app/dir/public; passenger_enabled on; proxy_set_header X_FORWARDED_PROTO https; ssl on; ssl_certificate /my/app/dir/certificate.pem; ssl_certificate_key /my/app/dir/privkey.pem; ssl_session_timeout 5m; ssl_protocols SSLv2 SSLv3 TLSv1; ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; ssl_prefer_server_ciphers on; } } 

而不是redirect所有http请求到https,我反而得到错误:

 The plain HTTP request was sent to HTTPS port 

我怎样才能解决这个问题? https请求https://an.internal.ip.address工作正常。

(这也发生在nginx-0.6.36,这是值得的)。

不知道这是否应该用Sinatra标记,但我还没有足够的代表。

如果你inputhttp:// server /浏览器发送纯文本请求到端口80上的服务器,而如果你inputhttps://服务器/它会发送encryption的请求到端口443.你在做什么你发送纯文本到https,所以Web服务器期望encryption,但得到平原。

它会工作,如果你做了https:// server:80 / ,所以webrowser知道它需要encryption,但发送到80.我不能期望从用户。

你想要的是,在80接受未encryption的stream量,只是httpredirect所有请求443在nginx中:

 server { listen server_ip:80; server_name server_name; location / { rewrite ^/(.*) https://server_name permanent; } }