Ricerca nel sito web

Correzione dell'errore "La semplice richiesta HTTP è stata inviata alla porta HTTPS" in Nginx


In questo articolo, mostreremo come risolvere il problema "400 Bad Request: la semplice richiesta HTTP è stata inviata alla porta HTTPS" nel server HTTP Nginx. Questo errore si verifica normalmente quando si tenta di configurare Nginx per gestire sia le richieste HTTP che HTTPS.

Ai fini di questa guida, stiamo considerando uno scenario in cui nginx serve più siti Web implementati tramite blocchi di server (o host virtuali in Apache), solo un sito Web utilizza SSL e il resto no.

Leggi anche: La guida definitiva per proteggere, rafforzare e migliorare le prestazioni di Nginx

Considereremo anche la configurazione SSL di esempio di seguito (abbiamo cambiato il nome di dominio effettivo per motivi di sicurezza), che dice a nginx di ascoltare sia la porta 80 che 443. E tutte le richieste su HTTP dovrebbero essere reindirizzate su HTTPS per impostazione predefinita.

Configurazione di esempio di 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;
        #}
}

Utilizzando la configurazione di cui sopra, una volta che un client tenta di accedere al tuo sito tramite la porta 80 ovvero http://example.com, l'errore in questione verrà visualizzato come nel seguente immagine dello schermo.

Riscontri questo errore perché ogni volta che un cliente tenta di accedere al tuo sito tramite HTTP, la richiesta viene reindirizzata a HTTPS. È perché nginx si aspetta che venga utilizzato SSL nella transazione, ma la richiesta originale (ricevuta tramite la porta 80) era semplicemente HTTP, si lamenta dell'errore.

D'altra parte, se un client utilizza https://example.com, non incontrerà l'errore precedente. Inoltre, se disponi di altri siti Web configurati per non utilizzare SSL, nginx proverà a utilizzare HTTPS per impostazione predefinita, risultando nell'errore precedente.

Per correggere questo errore, commenta la riga seguente nella configurazione o impostala su disattivata.

#ssl on 
OR
ssl off

Salva e chiudi il file. Quindi riavvia il servizio nginx.

systemctl restart nginx
OR
sudo systemctl restart nginx

In questo modo, puoi abilitare nginx per gestire sia le richieste HTTP che HTTPS per più blocchi server.

Infine, di seguito è riportato un elenco di articoli sulla configurazione di SSL HTTPS sulle comuni distribuzioni Linux e FreeBSD.

  1. Configurazione di HTTPS con Let's Encrypt Certificato SSL per Nginx su RHEL/CentOS
  2. Proteggi Nginx con il certificato SSL gratuito Let's Encrypt su Ubuntu e Debian
  3. Come proteggere Nginx con SSL e crittografare in FreeBSD

È tutto per ora. Se conosci un altro modo per risolvere questo errore, faccelo sapere tramite il modulo di feedback riportato di seguito.