Remediați eroarea „Solicitarea HTTP simplă a fost trimisă la portul HTTPS” în Nginx


În acest articol, vom arăta cum să rezolvăm „400 de solicitare greșită: cererea HTTP simplă a fost trimisă la portul HTTPS ” pe serverul HTTP Nginx. Această eroare apare în mod normal atunci când încercați să configurați Nginx pentru a gestiona atât solicitările HTTP, cât și HTTPS.

În scopul acestui ghid, luăm în considerare un scenariu în care nginx deservește mai multe site-uri web implementate prin blocuri de server (sau gazde virtuale în Apache), doar un site folosește SSL, iar restul nu.

Citiți și: Ghidul suprem pentru a asigura, întări și îmbunătăți performanța Nginx

Vom lua în considerare, de asemenea, exemplul de configurație SSL de mai jos (am schimbat numele real al domeniului din motive de securitate), care îi spune lui nginx să asculte atât portul 80, cât și 443. Și toate solicitările pe HTTP ar trebui să fie redirecționate implicit către HTTPS.

Nginx Sample Configuration

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

Folosind configurația de mai sus, odată ce un client încearcă să acceseze site-ul dvs. prin portul 80, adică http://example.com, eroarea în cauză va fi afișată ca în următorul captură de ecran.

Întâmpinați această eroare deoarece de fiecare dată când un client încearcă să vă acceseze site-ul prin HTTP, solicitarea este redirecționată către HTTPS. Pentru că nginx se așteaptă ca SSL să fie utilizat în tranzacție, dar cererile inițiale (primite prin portul 80) erau HTTP simplu, se plânge de eroare.

Pe de altă parte, dacă un client folosește https://example.com, nu va întâlni eroarea de mai sus. În plus, dacă aveți alte site-uri web configurate să nu utilizeze SSL, nginx va încerca să utilizeze HTTPS în mod implicit pentru ele, rezultând eroarea de mai sus.

Pentru a remedia această eroare, comentați rândul de mai jos în configurația dvs. sau dezactivați-l.

#ssl on 
OR
ssl off

Salvați și închideți fișierul. Apoi reporniți serviciul nginx.

systemctl restart nginx
OR
sudo systemctl restart nginx

În acest fel, puteți activa nginx să gestioneze atât cererile HTTP, cât și HTTPS pentru mai multe blocuri de server.

În cele din urmă, mai jos este o listă de articole despre configurarea SSL HTTPS pe distribuțiile Linux comune și FreeBSD.

  1. Configurarea HTTPS cu certificatul SSL Let’s Encrypt pentru Nginx pe RHEL/CentOS
  2. Securizează Nginx cu certificatul SSL gratuit Let’s Encrypt pe Ubuntu și Debian
  3. Cum să securizați Nginx cu SSL și să criptăm în FreeBSD

Asta este tot pentru acum. Dacă cunoașteți vreo altă modalitate de a rezolva această eroare, vă rugăm să ne informați prin formularul de feedback de mai jos.