Я пытаюсь развернуть веб-сайт только с доступом по протоколу 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;
}
}