Odpravite napako »Navadna zahteva HTTP je bila poslana na vrata HTTPS« v Nginxu


V tem članku bomo pokazali, kako rešiti\"400 slabo zahtevo: navadna zahteva HTTP je bila poslana na vrata HTTPS" v strežniku HTTP Nginx. Ta napaka se običajno pojavi, ko poskušate Nginx konfigurirati tako za obravnavanje zahtev HTTP in HTTPS.

Za namene tega priročnika razmišljamo o scenariju, v katerem nginx služi več spletnim mestom, ki se izvajajo prek navideznih gostiteljev v Apacheu) samo eno spletno mesto uporablja SSL, druga pa ne.

Upoštevali bomo tudi spodnjo vzorčno konfiguracijo SSL (zaradi varnostnih razlogov smo spremenili dejansko ime domene), ki pove nginxu, naj posluša vrata 80 in 443. In vse zahteve na HTTP je treba privzeto preusmeriti 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;
        #}
}

Z uporabo zgornje konfiguracije, ko odjemalec poskuša dostopati do vašega spletnega mesta prek vrat 80, tj. http://example.com , bo zadevna napaka prikazana kot na naslednjem posnetku zaslona.

Na to napako naletite, ker se vsakič, ko klient poskuša dostopati do vašega spletnega mesta prek protokola HTTP, zahteva preusmeri na HTTPS. Ker nginx pričakuje, da bo SSL uporabljen pri transakciji, vendar so bile prvotne zahteve t (prejete prek vrat 80) navadne HTTP, se pritožuje zaradi napake.

Po drugi strani pa, če odjemalec uporablja https://example.com , ne bo naletel na zgornjo napako. Poleg tega, če imate druga spletna mesta konfigurirana tako, da ne uporabljajo protokola SSL, bo nginx za njih privzeto poskušal uporabiti HTTPS, kar je povzročilo zgornjo napako.

Če želite odpraviti to napako, v svoji konfiguraciji komentirajte spodnjo vrstico ali jo nastavite na izklopljeno.

#ssl on 
OR
ssl off

Shranite in zaprite datoteko. Nato znova zaženite storitev nginx.

# systemctl restart nginx
OR
$ sudo systemctl restart nginx

Na ta način lahko omogočite, da nginx obravnava zahteve HTTP in HTTPS za več strežniških blokov.

Na koncu je spodaj še seznam člankov o nastavitvi protokola SSL HTTPS na običajnih distribucijah Linuxa in FreeBSD.

  1. Nastavitev HTTPS s šifriranjem SSL certifikata za Nginx na RHEL/CentOS
  2. Zaščitite Nginx z brezplačnim šifriranjem potrdila SSL v Ubuntu in Debianu
  3. Kako zavarovati Nginx s SSL in šifrirajmo v FreeBSD

To je vse za zdaj. Če poznate kakšen drug način za odpravo te napake, nam to sporočite prek spodnjega obrazca za povratne informacije.