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.
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.
Pour un site particulier, on crée deux blocs à l'intérieur du fichier de vhost :
# 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 ...
}
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
}
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.