Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.
Nginx Error 400: Bad Request (The plain HTTP request was sent to HTTPS port) Linux / DevOps

Nginx 400: The plain HTTP request was sent to HTTPS port — Решение

Обновлено: 18.08.2026  ·  Официальная база знаний

При попытке открыть сайт по протоколу HTTP на SSL-порту (например, http://example.com:443) Nginx возвращает HTML-страницу: 400 Bad Request: The plain HTTP request was sent to HTTPS port. В error.log записывается ошибка парсинга протокола.

Схема URL клиентаПорт NginxРезультат обработки
https://example.com443 ssl200 OK (Штатный TLS Handshake)
http://example.com80 (редирект)301 Moved Permanently на https://
http://example.com:443443 ssl400 Bad Request (Plain HTTP на SSL сокет)
  • Клиенты, вручную вбивающие http://domain:443 или использующие некорректно настроенные скрипты автоматизации, видят «сырую» страницу ошибки.
  • В современных версиях Nginx директива listen 443 ssl; ожидает обязательное TLS-рукопожатие при первом входящем байте.
  1. Убедитесь, что у вас настроен раздельный блок для приема стандартного незашифрованного HTTP-трафика на 80 порту с редиректом:
    server {
        listen 80;
        server_name example.com www.example.com;
        return 301 https://$host$request_uri;
    }
  2. В основном SSL-блоке server настройте специальную внутреннюю директиву перехвата ошибки 497 для прозрачного редиректа на HTTPS:
    server {
        listen 443 ssl;
        server_name example.com www.example.com;
    
        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    
        # Автоматический редирект клиента с HTTP на HTTPS при ошибке протокола:
        error_page 497 https://$host:$server_port$request_uri;
        
        location / {
            proxy_pass http://backend;
        }
    }
  3. Проверьте синтаксис файлов конфигурации: sudo nginx -t.
  4. Примените изменения без разрыва соединений: sudo systemctl reload nginx.
Что такое код 497: Код 497 — это нестандартный внутренний код возврата самого Nginx, который генерируется специально в ситуациях, когда клиент отправляет незашифрованный текстовый HTTP-запрос в сокет, настроенный исключительно на прием SSL/TLS.
Практический опыт инженера: Директива `error_page 497` незаменима для кастомных нетривиальных HTTPS-портов (например, `https://site.com:8443`), куда пользователи часто переходят по прямым ссылкам без явного указания схемы `https://`.

Частые вопросы (FAQ)

Почему Nginx не делает этот редирект по умолчанию?

По стандартам безопасности RFC чистый HTTP-клиент, случайно постучавшийся в защищенный SSL-порт, не должен неявно переключаться без явного согласования криптографического контекста.

Работает ли директива 'ssl on;' в новых версиях Nginx?

Директива 'ssl on;' устарела и удалена. Начиная с Nginx 1.15+, параметр ssl указывается строго внутри директивы listen: 'listen 443 ssl;'.

Что произойдет, если забыть флаг ssl в listen 443?

Nginx будет ожидать открытый HTTP-трафик на 443 порту. При попытке зайти по https:// браузер выдаст ошибку SSL_ERROR_RX_RECORD_TOO_LONG.

Можно ли слушать HTTP и HTTPS на одном и том же порту?

Штатно протоколы разделяются, но с помощью обработки error_page 497 можно добиться бесшовного перенаправления клиента на HTTPS на том же самом порту.