Rediriger les requêtes HTTP vers HTTPS, avec ou sans changement des ports par défaut d'Nginx (Debian)

Introduction

Lorsque l'on met en place un site web, il est obligatoire désormais de forcer l'utilisation de HTTPS afin de sécuriser les échanges. Autrement dit, si un utilisateur tente d'accéder au site web via le protocole HTTP (port 80), il doit être redirigé vers HTTPS (port 443).

Avec Nginx, cette redirection est simple à configurer, que l'on utilise les ports par défaut (80/443) ou des ports personnalisés.


1. Redirection globale (tous les sites)

Si l'on veut que toutes les requêtes HTTP soient redirigées vers HTTPS, on peut créer un vhost catch-all :

server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 301 https://example.com$request_uri; # remplacer par un domaine fixe
}

Attention :
Bien que cela soit possible, et malheureusement courant, il ne faut surtout pas utiliser $host à la place de "example.com" dans le return. Cela peut créer une faille de redirection (les utilisateurs pourraient être redirigés vers des domaines malveillants). Utilisez toujours un domaine fixe (example.com) ou configurez des redirections par vhost spécifique.


2. Redirection par vhost (cas le plus courant et recommandé)

Pour un site particulier, on crée deux blocs à l'intérieur du fichier de vhost :

Exemple avec ports standards (80 → 443) pour www.jesuissuper.com

# La redirection 80 -> 443

server {
listen 80;
listen [::]:80;
server_name jesuissuper.com www.jesuissuper.com;
return 301 https://jesuissuper.com$request_uri;
}

# Le vhost HTTPS

server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name jesuissuper.com www.jesuissuper.com;

# root
root /var/www/jesuissuper;

# Configuration SSL (certificats Let's Encrypt par ex.)
ssl_certificate /etc/letsencrypt/live/monsite.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/monsite.com/privkey.pem;

# Forcer HTTPS à long terme
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

# ... suite du vhost ...
}

3. Redirection avec ports personnalisés

Si les ports par défaut ont été modifiés (par exemple HTTP sur 5501 et HTTPS sur 5502), on adapte :

# La redirection HTTP de 5501 -> 5502

server {
listen 0.0.0.0:5501;
listen [::]:5501;
server_name monsite.com www.monsite.com;
return 301 https://monsite.com:5502$request_uri;
}

# Le vhost HTTPS (avec port HTTPS changé pour le 5502)

server {
listen 0.0.0.0:5502 ssl http2;
listen [::]:5502 ssl http2;
server_name monsite.com www.monsite.com;

/var/www/monsite.com;

ssl_certificate /etc/letsencrypt/live/monsite.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/monsite.com/privkey.pem;

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

# ... suite du contenu du vhost
}

4. Bonnes pratiques

nginx -t && systemctl reload nginx

Prévoyez IPv6 (listen [::]:...).

Statut 301 ou 308 ?

Automatisation :
certbot --nginx --redirect peut générer automatiquement les vhosts avec redirection.


⬆️ Retour en haut de la page