Rediriger HTTP vers HTTPS avec .htaccess (redirection 301)

Publié le Mis à jour le 5 min de lecture

Vos visiteurs arrivent encore sur la version non chiffrée ? Quelques lignes dans le fichier .htaccess suffisent pour rediriger chaque appel HTTP vers HTTPS de façon permanente, en 301.

Votre serveur diffuse déjà le site en HTTPS, mais vos visiteurs arrivent toujours sur la version HTTP non chiffrée ? Il manque alors une redirection. Dans ce guide, vous mettez en place une redirection permanente (code de statut 301) de HTTP vers HTTPS à l'aide d'un fichier .htaccess.

Une redirection 301 est aussi le bon choix du point de vue du SEO : les moteurs de recherche transfèrent ainsi le positionnement de l'ancienne adresse HTTP vers l'adresse HTTPS, au lieu de traiter les deux variantes comme deux pages distinctes.

Prérequis

  • Votre serveur fait tourner Apache. Pour nginx, la configuration est différente, nous y revenons plus bas.
  • Un certificat SSL valide est déjà en place. Si ce n'est pas le cas, vous trouverez la marche à suivre dans l'article Installer gratuitement un certificat SSL avec Let's Encrypt.
  • Vous avez accès au répertoire web de votre serveur, en SSH ou en FTP.

Important : ne mettez la redirection en place qu'une fois HTTPS fonctionnel. Sinon, vous renvoyez vos visiteurs vers une adresse qui affiche un avertissement de certificat.

Activer mod_rewrite et autoriser le fichier .htaccess

La redirection s'appuie sur le module Apache mod_rewrite. Activez-le, puis redémarrez Apache :

a2enmod rewrite
systemctl restart apache2

Pour qu'Apache lise réellement le fichier .htaccess, le VirtualHost doit l'autoriser. Vérifiez dans la configuration sous /etc/apache2/sites-available/ que AllowOverride All est bien défini pour votre répertoire :

<Directory /var/www/MonDomaine.fr>
    AllowOverride All
    Require all granted
</Directory>

Si la valeur est AllowOverride None, votre fichier .htaccess est ignoré en silence. Après une modification du fichier VirtualHost, un redémarrage d'Apache est nécessaire.

Créer le fichier .htaccess

Placez-vous dans le répertoire qui contient votre site web :

cd /var/www/<VOTRE-REPERTOIRE-WEB>

Ouvrez le fichier .htaccess dans l'éditeur. S'il n'existe pas encore, la commande le crée :

nano .htaccess

Saisissez les lignes suivantes. Cette variante vérifie directement si la connexion est chiffrée, puis ajoute à la cible le chemin complet qui a été appelé :

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Enregistrez le fichier avec « CTRL + X », puis « Y » et « Entrée ».

Variante basée sur le port du serveur

Sur les configurations plus anciennes, où la variable HTTPS n'est pas définie, il faut interroger le port à la place :

RewriteEngine On
RewriteCond %{SERVER_PORT} !^443$
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L]

Variante derrière un reverse proxy ou un load balancer

Si un reverse proxy ou un load balancer se trouve devant votre Apache et termine lui-même le chiffrement, Apache reçoit une requête non chiffrée. La règle ci-dessus provoquerait alors une redirection sans fin. Dans ce cas, exploitez l'en-tête que le proxy transmet :

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Tester la redirection

Appelez votre domaine dans le navigateur via http://. Vous devriez arriver immédiatement sur https://. En ligne de commande, vous vérifiez le code de statut directement :

curl -I http://MonDomaine.fr

La sortie doit contenir HTTP/1.1 301 Moved Permanently, ainsi qu'une ligne Location avec l'adresse HTTPS. Si un code de statut 302 apparaît à la place, vérifiez que la règle contient bien R=301.

Activer HSTS (optionnel)

Avec HTTP Strict Transport Security, vous demandez au navigateur de ne plus jamais appeler votre domaine en HTTP. Le premier appel non sécurisé disparaît ainsi. Activez d'abord le module nécessaire :

a2enmod headers
systemctl restart apache2

Complétez ensuite le fichier .htaccess :

<IfModule mod_headers.c>
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
</IfModule>

Attention : HSTS vous engage pour un an. Tant que la valeur est enregistrée dans le navigateur, le domaine n'est plus joignable en HTTP. Ne posez cet en-tête qu'une fois HTTPS parfaitement stable et tous les sous-domaines munis d'un certificat valide.

Erreurs fréquentes

  • Boucle infinie (« too many redirects ») : presque toujours la conséquence d'un proxy placé en amont. Utilisez la variante avec X-Forwarded-Proto.
  • Rien ne se passe : soit mod_rewrite n'est pas activé, soit le VirtualHost n'autorise aucun fichier .htaccess (AllowOverride None).
  • Erreur 500 après l'enregistrement : une faute de frappe dans le fichier .htaccess. La cause exacte figure dans le journal d'erreurs d'Apache, sous /var/log/apache2/error.log.
  • Contenu mixte : la page se charge bien en HTTPS, mais elle appelle encore des images ou des scripts en HTTP. Corrigez ces adresses dans votre code source ou dans la base de données.
  • Fichier introuvable : le fichier .htaccess commence par un point, il est donc masqué. La commande ls -la vous le montre.

Redirection sans .htaccess

Un fichier .htaccess est relu à chaque requête. Si vous avez accès à la configuration du serveur, il est plus rapide de placer les règles directement dans le VirtualHost. Pour le VirtualHost HTTP, ceci suffit :

<VirtualHost *:80>
    ServerName MonDomaine.fr
    Redirect permanent / https://MonDomaine.fr/
</VirtualHost>

Si vous utilisez nginx au lieu d'Apache, il n'existe pas de fichiers .htaccess. La redirection se déclare alors dans le bloc server du port 80 :

server {
    listen 80;
    server_name MonDomaine.fr www.MonDomaine.fr;
    return 301 https://$host$request_uri;
}

Questions fréquentes

Pourquoi une redirection 301 et pas une 302 ?
Le code 301 signale une redirection permanente. Les moteurs de recherche transfèrent ainsi l'évaluation de l'ancienne adresse HTTP vers l'adresse HTTPS. Un 302 est considéré comme temporaire et ne transmet pas ces signaux.
Mon fichier .htaccess est ignoré. D'où cela vient-il ?
Soit mod_rewrite n'est pas activé, soit le VirtualHost n'autorise aucun override. Définissez AllowOverride All pour votre répertoire, puis redémarrez Apache.
Pourquoi est-ce que je me retrouve dans une boucle infinie ?
Cela arrive presque toujours quand un reverse proxy ou un load balancer termine le chiffrement devant Apache. Exploitez alors l'en-tête X-Forwarded-Proto au lieu de la variable HTTPS.
Est-ce que cela fonctionne aussi avec nginx ?
Non, nginx ne connaît pas les fichiers .htaccess. La redirection se déclare directement dans le bloc server du port 80, avec la ligne return 301 https://$host$request_uri.
Faut-il activer HSTS en plus ?
HSTS renforce la sécurité, mais il vous engage pour la durée indiquée. Ne l'activez qu'une fois HTTPS fiable sur le domaine et sur tous les sous-domaines.

.htaccess Weiterleitung 301-Redirect HTTPS Apache mod_rewrite HSTS