Поиск по сайту:

Исправить ошибку «Простой HTTP-запрос был отправлен на порт HTTPS» в Nginx.


В этой статье мы покажем, как решить проблему «400 Bad Request: простой HTTP-запрос был отправлен на порт HTTPS» на HTTP-сервере Nginx. Эта ошибка обычно возникает, когда вы пытаетесь настроить Nginx для обработки как HTTP, так и HTTPS-запросов.

Для целей данного руководства мы рассматриваем сценарий, в котором nginx обслуживает несколько веб-сайтов, реализованных через серверные блоки (или виртуальные хосты в Apache), только один веб-сайт использует SSL, а остальные — нет.

Читайте также: полное руководство по обеспечению безопасности, усилению защиты и повышению производительности Nginx

Мы также рассмотрим пример конфигурации SSL ниже (мы изменили фактическое имя домена по соображениям безопасности), который сообщает nginx прослушивать порты 80 и 443. А все запросы по HTTP должны перенаправляться на HTTPS по умолчанию.

Пример конфигурации Nginx

server{
        listen 80;
        server_name example.com www.example.com;
        return 301 https://www.example.com$request_uri;
}
server {
        listen 443 ssl http2;
        server_name example.com www.example.com;

        root   /var/www/html/example.com/;
        index index.php index.html index.htm;

        #charset koi8-r;
        access_log /var/log/nginx/example.com/example.com_access_log;
        error_log   /var/log/nginx/example.com/example.com_error_log   error;

        # SSL/TLS configs
        ssl on;
        ssl_certificate /etc/ssl/certs/example_com_cert_chain.crt;
        ssl_certificate_key /etc/ssl/private/example_com.key;

        include /etc/nginx/ssl.d/ssl.conf;

        location / {
                try_files $uri $uri/ /index.php?$query_string;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
                root   /var/www/html/example.com/;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {

                root   /var/www/html/example.com/;
                fastcgi_pass   127.0.0.1:9001;
                #fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                include         fastcgi_params;
                include /etc/nginx/fastcgi_params;

        }
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
}

Используя приведенную выше конфигурацию, как только клиент попытается получить доступ к вашему сайту через порт 80, то есть http://example.com, рассматриваемая ошибка будет отображаться следующим образом. Скриншот.

Вы сталкиваетесь с этой ошибкой, потому что каждый раз, когда клиент пытается получить доступ к вашему сайту через HTTP, запрос перенаправляется на HTTPS. Это связано с тем, что nginx ожидает, что в транзакции будет использоваться SSL, но исходный запрос (полученный через порт 80) был простым HTTP, он жалуется на ошибку.

С другой стороны, если клиент использует https://example.com, он не столкнется с вышеуказанной ошибкой. Кроме того, если у вас есть другие веб-сайты, настроенные не на использование SSL, nginx попытается использовать для них HTTPS по умолчанию, что приведет к указанной выше ошибке.

Чтобы исправить эту ошибку, закомментируйте строку ниже в вашей конфигурации или отключите ее.

#ssl on 
OR
ssl off

Сохраните и закройте файл. Затем перезапустите службу nginx.

systemctl restart nginx
OR
sudo systemctl restart nginx

Таким образом, вы можете включить nginx для обработки как HTTP, так и HTTPS-запросов для нескольких блоков сервера.

Наконец, ниже приведен список статей о настройке SSL HTTPS в распространенных дистрибутивах Linux и FreeBSD.

  1. Настройка HTTPS с SSL-сертификатом Let’s Encrypt для Nginx на RHEL/CentOS
  2. Защитите Nginx с помощью бесплатного SSL-сертификата Let's Encrypt в Ubuntu и Debian
  3. Как защитить Nginx с помощью SSL и Let’s Encrypt во FreeBSD

Это все на данный момент. Если вам известен какой-либо другой способ решения этой ошибки, сообщите нам об этом через форму обратной связи ниже.