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.
- HTTPS instellen met Let's Encrypt SSL-certificaat voor Nginx op RHEL/CentOS
- Beveilig Nginx met het gratis Let's Encrypt SSL-certificaat op Ubuntu en Debian
- 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.