Zoeken op website

Fix “Het gewone HTTP-verzoek is naar de HTTPS-poort verzonden” Fout in Nginx


In dit artikel laten we zien hoe je het “400 Bad Request: The plain HTTP request was sent to HTTPS port” in de Nginx HTTP-server kunt oplossen. Deze fout treedt normaal gesproken op wanneer u Nginx probeert te configureren om zowel HTTP- als HTTPS-verzoeken af te handelen.

Voor het doel van deze handleiding overwegen we een scenario waarin nginx meerdere websites bedient, geïmplementeerd via serverblokken (of virtuele hosts in Apache). Slechts één website gebruikt SSL en de rest niet.

Lees ook: de ultieme gids voor het beveiligen, versterken en verbeteren van de prestaties van Nginx

We zullen ook de onderstaande voorbeeld-SSL-configuratie bekijken (we hebben de daadwerkelijke domeinnaam om veiligheidsredenen gewijzigd), die nginx vertelt om naar zowel poort 80 als 443 te luisteren. En alle verzoeken op HTTP moeten standaard worden omgeleid naar HTTPS.

Nginx-voorbeeldconfiguratie

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

Met de bovenstaande configuratie wordt, zodra een client toegang probeert te krijgen tot uw site via poort 80, d.w.z. http://example.com, de betreffende fout weergegeven zoals in het volgende schermafdruk.

U komt deze fout tegen omdat elke keer dat een client toegang probeert te krijgen tot uw site via HTTP, het verzoek wordt omgeleid naar HTTPS. Het is omdat de nginx verwacht dat SSL wordt gebruikt in de transactie, terwijl het oorspronkelijke verzoek (ontvangen via poort 80) gewoon HTTP was, en klaagt over de fout.

Aan de andere kant, als een klant https://example.com gebruikt, zal hij de bovenstaande fout niet tegenkomen. Als u bovendien andere websites heeft geconfigureerd om SSL niet te gebruiken, zal nginx standaard HTTPS proberen te gebruiken, wat resulteert in de bovenstaande fout.

Om deze fout op te lossen, plaatst u een commentaar op de onderstaande regel in uw configuratie of schakelt u deze uit.

#ssl on 
OR
ssl off

Sla het bestand op en sluit het. Start vervolgens de nginx-service opnieuw.

systemctl restart nginx
OR
sudo systemctl restart nginx

Op deze manier kunt u nginx inschakelen om zowel HTTP- als HTTPS-verzoeken voor meerdere serverblokken af te handelen.

Tenslotte vindt u hieronder een lijst met artikelen over het instellen van SSL HTTPS op gangbare Linux-distributies en FreeBSD.

  1. HTTPS instellen met Let's Encrypt SSL-certificaat voor Nginx op RHEL/CentOS
  2. Beveilig Nginx met het gratis Let's Encrypt SSL-certificaat op Ubuntu en Debian
  3. Hoe Nginx te beveiligen met SSL en Let's Encrypt in FreeBSD

Dat is het voor nu. Als u een andere manier kent om deze fout op te lossen, laat het ons dan weten via het onderstaande feedbackformulier.