Ispravite grešku „Obični HTTP zahtjev je poslan na HTTPS port“ u Nginxu


U ovom članku ćemo pokazati kako riješiti “400 loš zahtjev: obični HTTP zahtjev je poslan na HTTPS port” na Nginx HTTP serveru. Ova greška se obično javlja kada pokušate da konfigurišete Nginx da obrađuje i HTTP i HTTPS zahteve.

U svrhu ovog vodiča, razmatramo scenario u kojem nginx opslužuje više web lokacija implementiranih putem serverskih blokova (ili virtualnih hostova u Apacheu), samo jedna web stranica koristi SSL, a ostale ne.

Pročitajte također: Ultimativni vodič za osiguranje, ojačanje i poboljšanje performansi Nginxa

Također ćemo razmotriti primjer SSL konfiguracije u nastavku (promijenili smo stvarni naziv domene iz sigurnosnih razloga), koji govori nginx-u da sluša oba porta 80 i 443. I svi zahtjevi na HTTP-u bi trebali biti preusmjereni na HTTPS prema zadanim postavkama.

Nginx uzorak konfiguracije

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, kada klijent pokuša pristupiti vašoj web-lokaciji preko porta 80 tj. http://example.com, dotična greška će se prikazati kao u sljedećem snimak ekrana.

Nailazite na ovu grešku jer svaki put kada klijent pokuša pristupiti vašoj web stranici putem HTTP-a, zahtjev se preusmjerava na HTTPS. Zato što nginx očekuje da će se SSL koristiti u transakciji, ali originalni zahtjevi t (primljeni preko porta 80) su bili običan HTTP, žali se na grešku.

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

Da ispravite ovu grešku, komentirajte donju liniju u svojoj konfiguraciji ili je isključite.

#ssl on 
OR
ssl off

Sačuvajte i zatvorite datoteku. Zatim ponovo pokrenite nginx servis.

systemctl restart nginx
OR
sudo systemctl restart nginx

Na ovaj način možete omogućiti nginx-u da rukuje HTTP i HTTPS zahtjevima za više blokova servera.

Konačno, ispod je lista članaka o postavljanju SSL HTTPS-a na uobičajenim Linux distribucijama i FreeBSD-u.

  1. Postavljanje HTTPS-a sa Let’s Encrypt SSL certifikatom za Nginx na RHEL/CentOS
  2. Osigurajte Nginx s besplatnim Let’s Encrypt SSL certifikatom na Ubuntu i Debianu
  3. Kako osigurati Nginx sa SSL-om i šifrirati u FreeBSD-u

To je sve za sada. Ako znate bilo koji drugi način da riješite ovu grešku, javite nam putem obrasca za povratne informacije u nastavku.