Rett opp "Den vanlige HTTP-forespørselen ble sendt til HTTPS-porten" Feil i Nginx


I denne artikkelen vil vi vise hvordan du løser «400 Bad Request: Den vanlige HTTP-forespørselen ble sendt til HTTPS-port» i Nginx HTTP-server. Denne feilen oppstår vanligvis når du prøver å konfigurere Nginx til å håndtere både HTTP- og HTTPS-forespørsler.

For formålet med denne veiledningen vurderer vi et scenario der nginx betjener flere nettsteder implementert gjennom serverblokker (eller virtuelle verter i Apache), bare ett nettsted bruker SSL og resten ikke.

Les også: Den ultimate guiden for å sikre, herde og forbedre ytelsen til Nginx

Vi vil også vurdere eksempelet på SSL-konfigurasjonen nedenfor (vi har endret det faktiske domenenavnet av sikkerhetsgrunner), som forteller nginx å lytte til både port 80 og 443. Og alle forespørsler på HTTP skal som standard omdirigeres til HTTPS.

Nginx-eksempelkonfigurasjon

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

Ved å bruke konfigurasjonen ovenfor, når en klient prøver å få tilgang til nettstedet ditt via port 80, dvs. http://example.com, vil den aktuelle feilen vises som i følgende skjermbilde.

Du støter på denne feilen fordi hver gang en klient prøver å få tilgang til nettstedet ditt via HTTP, blir forespørselen omdirigert til HTTPS. Det er fordi nginx forventer at SSL skal brukes i transaksjonen, men de opprinnelige forespørslene (mottatt via port 80) var vanlig HTTP, den klager over feilen.

På den annen side, hvis en klient bruker https://example.com, vil de ikke støte på feilen ovenfor. I tillegg, hvis du har andre nettsteder konfigurert til å ikke bruke SSL, vil nginx prøve å bruke HTTPS som standard for dem, noe som resulterer i feilen ovenfor.

For å fikse denne feilen, kommenter ut linjen nedenfor i konfigurasjonen eller sett den til av.

#ssl on 
OR
ssl off

Lagre og lukk filen. Start deretter nginx-tjenesten på nytt.

systemctl restart nginx
OR
sudo systemctl restart nginx

På denne måten kan du aktivere nginx til å håndtere både HTTP- og HTTPS-forespørsler for flere serverblokker.

Til slutt, nedenfor er en liste over artikler om å sette opp SSL HTTPS på vanlige Linux-distribusjoner og FreeBSD.

  1. Sette opp HTTPS med Let's Encrypt SSL-sertifikat for Nginx på RHEL/CentOS
  2. Sikre Nginx med gratis Let's Encrypt SSL-sertifikat på Ubuntu og Debian
  3. Hvordan sikre Nginx med SSL og la oss kryptere i FreeBSD

Det er alt for nå. Hvis du vet om noen annen måte å løse denne feilen på, vennligst gi oss beskjed via tilbakemeldingsskjemaet nedenfor.