Pesquisa de site

Corrigir o erro “A solicitação HTTP simples foi enviada para a porta HTTPS” no Nginx


Neste artigo, mostraremos como resolver o “400 Bad Request: The plain HTTP request was sent to HTTPS port” no servidor Nginx HTTP. Este erro normalmente surge quando você tenta configurar o Nginx para lidar com solicitações HTTP e HTTPS.

Para os fins deste guia, estamos considerando um cenário em que o nginx atende vários sites implementados por meio de blocos de servidor (ou hosts virtuais no Apache), apenas um site usa SSL e o restante não.

Leia também: O guia definitivo para proteger, fortalecer e melhorar o desempenho do Nginx

Também consideraremos o exemplo de configuração SSL abaixo (alteramos o nome de domínio real por motivos de segurança), que diz ao nginx para escutar as portas 80 e 443. E todas as solicitações HTTP devem ser redirecionadas para HTTPS por padrão.

Configuração de amostra 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;
        #}
}

Usando a configuração acima, quando um cliente tentar acessar seu site pela porta 80, ou seja, http://example.com, o erro em questão será exibido como a seguir captura de tela.

Você encontra esse erro porque toda vez que um cliente tenta acessar seu site via HTTP, a solicitação é redirecionada para HTTPS. É porque o nginx espera que SSL seja usado na transação, mas a solicitação original (recebida pela porta 80) era HTTP simples, ele reclama do erro.

Por outro lado, se um cliente usar https://example.com, ele não encontrará o erro acima. Além disso, se você tiver outros sites configurados para não usar SSL, o nginx tentará usar HTTPS por padrão para eles, resultando no erro acima.

Para corrigir esse erro, comente a linha abaixo em sua configuração ou desative-a.

#ssl on 
OR
ssl off

Salve e feche o arquivo. Em seguida, reinicie o serviço nginx.

systemctl restart nginx
OR
sudo systemctl restart nginx

Dessa forma, você pode permitir que o nginx lide com solicitações HTTP e HTTPS para vários blocos de servidor.

Finalmente, abaixo está uma lista de artigos sobre como configurar SSL HTTPS em distribuições Linux comuns e FreeBSD.

  1. Configurando HTTPS com certificado SSL Let’s Encrypt para Nginx no RHEL/CentOS
  2. Nginx seguro com certificado SSL Let’s Encrypt grátis no Ubuntu e Debian
  3. Como proteger o Nginx com SSL e vamos criptografar no FreeBSD

É tudo por agora. Se você souber de alguma outra maneira de resolver esse erro, informe-nos por meio do formulário de feedback abaixo.