我试图部署一个网站只有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; } }