Ошибка 400 Bad Request «the plain http request was sent to https port» на Nginx довольно распространенная проблема, когда вы пытаетесь настроить Nginx для обработки запросов http и https + сертификат SSL. Как получить бесплатный сертификат Let’s Encrypt, мы рассказывали в статье.
Данной инструкцией объясню причину и решение, что бы запросы к сайту Nginx отрабатывал корректно.
Перейдем к конфигурационному файлу Nginx. В CentOS, обычно, конфиг расположен в директории /etc/nginx/conf.d/. В Ubuntu и Debian — в директории /etc/nginx/sites-enabled/. Во FreeBSD в /etc/nginx/nginx.conf. . Выглядит конфиг nginx у вас примерно так (убрал лишнюю информацию, что бы не нагружать):
server { listen 80; listen 443; server_name adminwin.ru www.adminwin.ru; root /home/myhome/app/public; passenger_enabled on; # Конфиги SSL / TLS ssl on; ssl_certificate /opt/nginx/ssl_keys/ssl.crt; ssl_certificate_key /opt/nginx/ssl_keys/ssl.key; .... }
проблема данного конфигурационного файла nginx в том, что при обращении по 80 порт (HTTP) на ваш сайт, веб сервер ожидает использование SSL, который должен использоваться только при обращении н 443 порт (HTTPS).
Исправим конфиг, закомментировав в нем строку с командой «ssl on;» или изменив команду на «ssl off;» и приведем его в следующий вид:
server { listen 80; listen 443; server_name adminwin.ru www.adminwin.ru; root /home/myhome/app/public; passenger_enabled on; # Конфиги SSL / TLS #ssl on; ssl off; ssl_certificate /opt/nginx/ssl_keys/ssl.crt; ssl_certificate_key /opt/nginx/ssl_keys/ssl.key; .... }
Теперь у нас сайт по 80 порту (HTTP) открывается, а по 443 (HTTPS) не доступен.
Получается, что полностью исключить или включить ssl мы не можем, но можем указать конкретно использование ssl только для 443 портов (HTTPS).
Исправный конфиг будет выглядеть следующим образом:
server { listen 80; listen 443 default ssl; server_name adminwin.ru www.adminwin.ru; root /home/myhome/app/public; passenger_enabled on; # Конфиги SSL / TLS #ssl on; ssl_certificate /opt/nginx/ssl_keys/ssl.crt; ssl_certificate_key /opt/nginx/ssl_keys/ssl.key; .... }
В конечном конфиге Nginx мы явно указали использовать SSL для 443 запросов на сайт строчкой «listen 443 default ssl;«, в некоторых версиях срабатывает «listen 443 ssl;»
Напишите в комментариях, помогла статья решить проблему с ошибкой «Обычный HTTP-запрос был отправлен на HTTPS-порт» или нет.