Ispravite pogrešku "Obični HTTP zahtjev poslan je na HTTPS priključak" u Nginxu


U ovom ćemo članku pokazati kako riješiti "400 loših zahtjeva: obični HTTP zahtjev poslan je na HTTPS priključak" na Nginx HTTP poslužitelju. Ova se pogreška obično pojavljuje kada pokušate konfigurirati Nginx za obradu HTTP i HTTPS zahtjeva.

U svrhu ovog vodiča razmatramo scenarij u kojem nginx poslužuje više web stranica implementiranih putem virtualnih hostova u Apacheu) samo jedno web mjesto koristi SSL, a ostale ne.

U nastavku ćemo razmotriti i primjer SSL konfiguracije (iz sigurnosnih smo razloga promijenili stvarno ime domene), koja govori nginxu da preslušava i priključke 80 i 443. A svi zahtjevi na HTTP-u trebali bi se prema zadanim postavkama preusmjeriti na HTTPS.

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

Koristeći gornju konfiguraciju, nakon što klijent pokuša pristupiti vašoj stranici putem porta 80 tj. http://example.com , dotična pogreška prikazat će se kao na sljedećem snimku zaslona.

Nailazite na ovu pogrešku jer svaki put kada klijent pokuša pristupiti vašoj web lokaciji putem HTTP-a, zahtjev se preusmjerava na HTTPS. To je zato što nginx očekuje da se SSL koristi u transakciji, ali izvorni zahtjevi t (primljeni putem porta 80) bili su obični HTTP, žali se na pogrešku.

S druge strane, ako klijent koristi https://example.com , neće naići na gornju pogrešku. Osim toga, ako imate druga web mjesta konfigurirana da ne koriste SSL, nginx će pokušati koristiti HTTPS prema zadanim postavkama za njih što je rezultiralo gornjom pogreškom.

Da biste ispravili ovu pogrešku, komentirajte donji redak u svojoj konfiguraciji ili ga isključite.

#ssl on 
OR
ssl off

Spremite i zatvorite datoteku. Zatim ponovo pokrenite nginx uslugu.

# systemctl restart nginx
OR
$ sudo systemctl restart nginx

Na ovaj način možete omogućiti nginxu da obrađuje i HTTP i HTTPS zahtjeve za više blokova poslužitelja.

Na kraju, dolje je popis članaka o postavljanju SSL HTTPS-a na uobičajene Linux distribucije i FreeBSD.

  1. Postavljanje HTTPS-a s šifriranim SSL certifikatom za Nginx na RHEL/CentOS
  2. Osigurajte Nginx s besplatnim šifriranjem SSL certifikata na Ubuntuu i Debianu
  3. Kako osigurati Nginx pomoću SSL-a i šifrirajmo u FreeBSD-u

To je sve za sada. Ako znate bilo koji drugi način za rješavanje ove pogreške, javite nam putem donjeg obrasca za povratne informacije.