Назад | Перейти на главную страницу

Как я могу обслуживать https только с помощью пассажира 2.2.9, nginx 0.7.65 и sinatra 0.94?

Я пытаюсь развернуть веб-сайт только с доступом по протоколу https, без доступа по протоколу http. Я уверен, что мне просто не хватает какой-то простой строчки в файле конфигурации.

Как сказано в названии, это Sinatra 0.9.4 на nginx 0.7.65 через пассажирский 2.2.9.

В основном рубиновом файле для сервиса Sinatra есть:

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;

   }

 }

Вместо перенаправления всех HTTP-запросов на https я получаю сообщение об ошибке:

The plain HTTP request was sent to HTTPS port

Как я могу это исправить? https запросы к https: //an.internal.ip.address работают нормально.

(это также происходит с nginx-0.6.36, чего стоит).

Не уверен, что это должно быть помечено Синатрой, но у меня пока недостаточно репутации для этого.

если вы введете http: // сервер / браузер отправляет простой текстовый запрос на сервер через порт 80. тогда как если вы введете https: // сервер / он отправит зашифрованный запрос на порт 443. вы отправляете простой текст на https, поэтому веб-сервер ожидает зашифрованный, но становится простым.

это сработало бы, если бы ты сделал https: // сервер: 80 /, поэтому веб-браузер знает, что нужно зашифровать, но отправляет на 80. Я сомневаюсь, что вы можете ожидать этого от пользователей.

то, что вы хотите, принять незашифрованный трафик на 80 и просто перенаправить все запросы http на 443. в nginx:

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