Fix "Den almindelige HTTP-anmodning blev sendt til HTTPS-port" Fejl i Nginx


I denne artikel viser vi, hvordan man løser “400 dårlig anmodning: Den almindelige HTTP-anmodning blev sendt til HTTPS-port” i Nginx HTTP-server. Denne fejl opstår normalt, når du prøver at konfigurere Nginx til at håndtere både HTTP- og HTTPS-anmodninger.

Med henblik på denne vejledning overvejer vi et scenarie, hvor nginx betjener flere websteder implementeret gennem virtuelle værter i Apache) kun et websted bruger SSL, og resten gør det ikke.

Vi vil også overveje eksemplet på SSL-konfiguration nedenfor (vi har ændret det faktiske domænenavn af sikkerhedsmæssige årsager), der beder nginx om at lytte til både port 80 og 443. Og alle anmodninger om HTTP skal omdirigeres til HTTPS som standard.

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 hjælp af ovenstående konfiguration, når en klient forsøger at få adgang til dit websted via port 80, dvs. http://eksempel.dk , vises den pågældende fejl som i det følgende skærmbillede.

Du støder på denne fejl, fordi hver gang en klien forsøger at få adgang til dit websted via HTTP, omdirigeres anmodningen til HTTPS. Det skyldes, at nginx forventer, at SSL skal bruges i transaktionen, men alligevel var den originale anmodning t (modtaget via port 80) almindelig HTTP, den klager over fejlen.

På den anden side, hvis en klient bruger https://example.com , vil de ikke støde på ovenstående fejl. Derudover, hvis du har andre websteder konfigureret til ikke at bruge SSL, vil nginx forsøge at bruge HTTPS som standard for dem, hvilket resulterer i ovenstående fejl.

For at rette denne fejl skal du kommentere linjen nedenfor i din konfiguration eller sætte den til fra.

#ssl on 
OR
ssl off

Gem og luk filen. Genstart derefter nginx-tjenesten.

# systemctl restart nginx
OR
$ sudo systemctl restart nginx

På denne måde kan du aktivere nginx til at håndtere både HTTP og HTTPS-anmodninger om flere serverblokke.

Endelig er nedenfor en liste over artikler om opsætning af SSL HTTPS på almindelige Linux-distributioner og FreeBSD.

  1. Opsætning af HTTPS med Lad os kryptere SSL-certifikat til Nginx på RHEL/CentOS
  2. Sikker Nginx med gratis Lad os kryptere SSL-certifikat på Ubuntu og Debian
  3. Sådan sikres Nginx med SSL, og lad os kryptere i FreeBSD

Det er alt for nu. Hvis du kender nogen anden måde at løse denne fejl på, bedes du give os besked via feedbackformularen nedenfor.