Búsqueda de sitios web

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


En este artículo, mostraremos cómo resolver la “400 solicitudes incorrectas: 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 los fines de esta guía, estamos considerando un escenario en el que nginx sirve múltiples sitios web implementados a través de bloques de servidores (o hosts virtuales en Apache), solo un sitio web usa SSL y el resto no.

Lea también: La guía definitiva para proteger, reforzar y mejorar el rendimiento de Nginx

También consideraremos la configuración 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 redirigirse a HTTPS de forma predeterminada.

Configuración de muestra de 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 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 se muestra a continuación captura de pantalla.

Encuentra este error porque cada vez que un cliente intenta acceder a su sitio a través de HTTP, la solicitud se redirige a HTTPS. Esto 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 con el 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 generará 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 servidores.

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

  1. Configuración de HTTPS con el certificado SSL Let's Encrypt 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 Let's Encrypt 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.