Se corrigió el error "La solicitud HTTP simple se envió al puerto HTTPS" en Nginx


En este artículo, mostraremos cómo resolver el "400 Solicitud incorrecta: la solicitud HTTP simple se envió al puerto HTTPS" en el servidor HTTP Nginx. Este error normalmente surge cuando intenta configurar Nginx para manejar solicitudes HTTP y HTTPS.

Para el propósito de esta guía, estamos considerando un escenario en el que nginx está sirviendo varios sitios web implementados a través de hosts virtuales en Apache) solo un sitio web usa SSL y el resto no.

También consideraremos la configuración de SSL de muestra a continuación (hemos cambiado el nombre de dominio real por razones de seguridad), que le dice a nginx que escuche tanto el puerto 80 como el 443. Y todas las solicitudes en HTTP deben ser redirigidas a HTTPS por defecto.

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;
        #}
}

Con la configuración anterior, una vez que un cliente intenta acceder a su sitio a través del puerto 80, es decir, http://example.com , el error en cuestión se mostrará como en la siguiente captura de pantalla.

Se encuentra con este error porque cada vez que un cliente intenta acceder a su sitio a través de HTTP, la solicitud se redirige a HTTPS. Se debe a que nginx espera que se use SSL en la transacción, pero la solicitud original (recibida a través del puerto 80) era HTTP simple, se queja del error.

Por otro lado, si un cliente usa https://example.com , no encontrará el error anterior. Además, si tiene otros sitios web configurados para no usar SSL, nginx intentará usar HTTPS de forma predeterminada para ellos, lo que dará como resultado el error anterior.

Para corregir este error, comente la línea a continuación en su configuración o desactívela.

#ssl on 
OR
ssl off

Guarde y cierre el archivo. Luego reinicie el servicio nginx.

# systemctl restart nginx
OR
$ sudo systemctl restart nginx

De esta manera, puede habilitar nginx para manejar solicitudes HTTP y HTTPS para múltiples bloques de servidor.

Finalmente, a continuación se muestra una lista de artículos sobre cómo configurar SSL HTTPS en distribuciones comunes de Linux y FreeBSD.

  1. Configuración de HTTPS con cifremos el certificado SSL para Nginx en RHEL/CentOS
  2. Proteja Nginx con el certificado SSL gratuito Let's Encrypt en Ubuntu y Debian
  3. Cómo proteger Nginx con SSL y cifremos en FreeBSD

Eso es todo por ahora. Si conoce alguna otra forma de resolver este error, háganoslo saber a través del formulario de comentarios a continuación.