Dans cet article, nous allons montrer comment résoudre le "400 Bad Request: La requête HTTP simple a été envoyée au port HTTPS" dans le serveur HTTP Nginx. Cette erreur se produit normalement lorsque vous essayez de configurer Nginx pour gérer à la fois les requêtes HTTP et HTTPS.
Pour les besoins de ce guide, nous envisageons un scénario dans lequel nginx sert plusieurs sites Web mis en œuvre via blocs de serveur (ou alors hôtes virtuels dans Apache) un seul site Web utilise SSL et les autres non.
Lire aussi: Le guide ultime pour sécuriser, renforcer et améliorer les performances de Nginx
Nous examinerons également l'exemple de configuration SSL ci-dessous (nous avons modifié le nom de domaine réel pour des raisons de sécurité), qui indique à nginx d'écouter les deux ports 80 et 443. Et toutes les requêtes sur HTTP doivent être redirigées vers HTTPS par défaut.
serveur{ écouter 80; nom_serveur example.com www.example.com; retour 301 https://www.example.com$request_uri; } serveur { écouter 443 ssl http2; nom_serveur example.com www.example.com; racine /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 erreur; # configs SSL/TLS SSL activé; certificat_ssl /etc/ssl/certs/example_com_cert_chain.crt; ssl_certificate_key /etc/ssl/private/example_com.key; inclure /etc/nginx/ssl.d/ssl.conf; emplacement / { try_files $uri $uri/ /index.php?$query_string; } error_page 500 502 503 504 /50x.html; emplacement = /50x.html { racine /var/www/html/example.com/; } # proxy les scripts PHP vers Apache à l'écoute sur 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # passer les scripts PHP au serveur FastCGI en écoute sur 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; inclure fastcgi_params; inclure /etc/nginx/fastcgi_params; } # refuser l'accès aux fichiers .htaccess, si la racine du document d'Apache # est d'accord avec celle de nginx # #emplacement ~ /\.ht { # tout refuser; #} }
En utilisant la configuration ci-dessus, une fois qu'un client essaie d'accéder à votre site via le port 80 c'est à dire http://example.com
, l'erreur en question s'affichera comme dans la capture d'écran suivante.
Vous rencontrez cette erreur car à chaque fois qu'un client essaie d'accéder à votre site via HTTP, la requête est redirigée vers HTTPS. C'est parce que le nginx s'attend à ce que SSL soit utilisé dans la transaction, mais la demande d'origine (reçue via le port 80) était HTTP simple, il se plaint de l'erreur.
En revanche, si un client utilise https://example.com
, ils ne rencontreront pas l'erreur ci-dessus. De plus, si d'autres sites Web sont configurés pour ne pas utiliser SSL, nginx essaiera d'utiliser HTTPS par défaut pour eux, ce qui entraînera l'erreur ci-dessus.
Pour corriger cette erreur, commentez la ligne ci-dessous dans votre configuration ou désactivez-la.
#ssl sur OU. SSL désactivé.
Enregistrez et fermez le fichier. Redémarrez ensuite le service nginx.
# systemctl redémarrer nginx. OU ALORS. $ sudo systemctl redémarrer nginx.
De cette façon, vous pouvez permettre à nginx de gérer à la fois les requêtes HTTP et HTTPS pour plusieurs blocs de serveurs.
Enfin, vous trouverez ci-dessous une liste d'articles sur la configuration de SSL HTTPS sur les distributions Linux courantes et FreeBSD.
C'est tout pour le moment. Si vous connaissez un autre moyen de résoudre cette erreur, veuillez nous en informer via le formulaire de commentaires ci-dessous.