Article mis à jour le 27/08/2022 (vérification des codes), publié initialement le 17/12/2014
Si vous venez de passer votre site de HTTP vers HTTPS, n’oubliez pas qu’il faut rediriger toutes les anciennes URL (en HTTP) vers les nouvelles (en HTTPS).
Ceci s’applique aussi à un site qui dès le début est en HTTPS, car il est probable que certains feront des liens (sans s’en rendre compte) vers le site en HTTP.
Gérer la redirection au niveau du VirtualHost sur Apache
Une bonne façon est de mettre en place la redirection directement dans le fichier de configuration qui définit votre VirtualHost. Ce fichier peut se trouver à divers emplacements selon le système que vous utilisez (voir ici pour Apache).
Si vous voulez rediriger toute URL en HTTP vers l’URL équivalente en HTTPS, ajoutez ceci dans le virtualhost qui correspond au HTTP :
Redirect permanent / https://www.example.com/
(pensez à remplacer par le nom de votre site)
Si vraiment vous voulez utiliser RewriteRule
(ce n’est pas une bonne idée a priori, voyez les commentaires) :
RewriteEngine on RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Ceci fonctionne pour toutes les URL gérées par le virtualhost, avec ou sans sous-domaine.
Evidemment, si c’est l’inverse qui vous intéresse, si vous voulez rediriger toute URL en HTTPS vers l’URL équivalente en HTTP, ajoutez ceci dans le virtualhost qui correspond au HTTPS :
Redirect permanent / http://www.example.com/
(pensez à remplacer par le nom de votre site)
Si vraiment vous voulez utiliser RewriteRule
(ce n’est pas une bonne idée a priori, voyez les commentaires) :
RewriteEngine on RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Gérer la redirection dans un fichier .htaccess
Vous pouvez aussi configurer ces redirections dans un fichier .htaccess
à la racine de votre site.
Rediriger HTTP vers HTTPS avec .htaccess
Dans ce cas, si vous voulez rediriger toute URL en HTTP vers l’URL équivalente en HTTPS, ajoutez ceci dans le fichier .htaccess à la racine de votre site :
RewriteEngine on RewriteCond %{HTTPS} !=on RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
La condition %{HTTPS} !=on
signifie “l’URL est demandée sans le protocole HTTPS“. Vous pouvez aussi tester RewriteCond %{HTTPS} off
Sur certains serveurs/hébergeurs, cela ne fonctionne pas de tester cette variable. Il faut alors passer par le n° de port, sachant que HTTP est sur le port 80 et HTTPS est sur le port 443.
Sur OVH, voici le code à utiliser :
RewriteEngine on RewriteCond %{SERVER_PORT} 80 RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Sur Gandi (instance Simple Hosting), voici le code à utiliser :
RewriteEngine on RewriteCond %{REQUEST_SCHEME} =http RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
(attention à ne pas mettre d’espace entre = et http)
Rediriger HTTP vers HTTPS et gérer www en même temps
Vous le savez, il ne faut pas créer de contenus dupliqués en laissant votre site accessible aussi bien avec que sans www. Il faut faire une redirection de la mauvaise vers la bonne structure. C’est encore mieux de faire les 2 redirections en 1 seul coup pour éviter les chaînes de redirections.
Si la version officielle de votre site contient le sous-domaine www, essayez ce code (remplacez le nom de domaine example.com par le vôtre) :
RewriteEngine On RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC] RewriteRule ^.*$ https://www.%1%{REQUEST_URI} [L,NE,R=301]
Rediriger HTTPS vers HTTP avec .htaccess
Si à l’inverse vous voulez rediriger toute URL en HTTPS vers l’URL équivalente en HTTP, ajoutez ceci dans le fichier .htaccess
à la racine de votre site :
RewriteEngine on RewriteCond %{HTTPS} on RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Sur OVH, voici le code à utiliser dans le fichier .htaccess
à la racine de votre site pour bloquer votre site en HTTP :
RewriteEngine on RewriteCond %{SERVER_PORT} 443 RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Redirection HTTP vers HTTPS avec d’autres serveurs
Redirection vers HTTPS avec un serveur IIS
Pour IIS 7, IIS 8 et supérieur, les explications sont fournies ici par Microsoft ou dans cet article (en anglais). En gros, il existe 3 méthodes (de la plus à la moins recommandée) :
- Redirection IIS avec le module URL Rewrite
- Redirection IIS avec le document par défaut (default.asp)
- Redirection IIS avec le module HTTP Redirect
Redirection vers HTTPS avec un serveur Lighttpd
Pour Lighttpd, voici comment faire (source) :
Exemple 1, on redirige tout :
$HTTP["scheme"] == "http" { # capture vhost name with regex conditiona -> %0 in redirect pattern # must be the most inner block to the redirect rule $HTTP["host"] =~ ".*" { url.redirect = (".*" => "https://%0$0") } }
Exemple 2, pour une seule URL spécifique :
$HTTP["scheme"] == "http" { $HTTP["host"] =~ ".*" { url.redirect = ("^/phpmyadmin/.*" => "https://%0$0") } }
Exemple 3, pour un vhost et une seule URL spécifique :
$HTTP["scheme"] == "http" { $HTTP["host"] == "sth.example.com" { url.redirect = ("^/phpmyadmin/.*" => "https://sth.example.com$0") } }
Vous pouvez aussi utiliser des tests de ce type:
if $HTTP["scheme"] == "https"
Redirection vers HTTPS avec un serveur Nginx
Pour Nginx, voici le code à mettre dans votre fichier de configuration (source) :
server { listen 80 default_server; listen [::]:80 default_server; server_name _; return 301 https://$host$request_uri; }
ou bien un code un peu plus robuste dans lequel on définit quels hostnames sont concernés :
server { listen 80 default_server; listen [::]:80 default_server; server_name example.com www.example.com; return 301 https://$server_name$request_uri; }
il faudra aussi un paramétrage pour le port 443 (il faudra d’autres détails, d’où le […]) :
server { listen 443 ssl; server_name example.com www.example.com; [...] }
Pour Nginx, vous trouverez d’autres détails dans cet article.
Remarques importantes
- en cas d’autres RewriteRule, il faut veiller à l’ordre et aux conflits : à vous de vérifier et tester
- en théorie mod_rewrite n’est pas la meilleure manière de procéder (voir ici) bien qu’en pratique ce soit un détail
- les choses peuvent se compliquer si le serveur gère plusieurs domaines différents en https
- il faudra aussi penser à combiner avec la gestion du www
- si vous avez de la réécriture d’URL, vérifiez que les règles n’interfèrent pas (on ne sait jamais)
Si besoin, consultez mon tuto sur les redirections ou posez votre question dans le forum .htaccess de WRI.
Questions réponses
Comment faire la redirection HTTP vers HTTPS sur WordPress ?
WordPress ne propose pas de moyen de gérer le passage à HTTPS directement dans le backoffice. Vous pouvez tester des plugins WordPress comme Really Simple SSL mais ne les ayant pas testés je n’ai pas d’avis. Je l’ai trouvé dans cet article dont je vous recommande la lecture.
Si vous avez un serveur dédié, gérez les redirections dans la config de votre serveur (VirtualHost sous Apache par exemple).
Sinon, suivez les consignes ci-dessus pour gérer les redirections dans le fichier .htaccess.
Comment rediriger HTTP vers HTTPS sur Joomla ?
Les méthodes ci-dessus fonctionnent mais vous pouvez aussi aller dans les paramètres, rubrique “Paramètres du serveur” > “Forcer HTTPS” et choisir “Administration et site”.
Redirection HTTPS sur Prestashop
Pour rediriger automatiquement en HTTPS les URL d’un site sous Prestashop, suivez ce tuto (en anglais).
Redirection HTTPS sur Drupal
Idem : pour faire une redirection automatique HTTPS d’un site sous Drupal, suivez ce tuto (en anglais).
Comment faire la redirection HTTP vers HTTPS chez OVH ?
Si vous avez un serveur dédié OVH, gérez les redirections dans la config de votre serveur (VirtualHost sous Apache par exemple). Sinon, sur un serveur mutualisé OVH, comme indiqué dans l’article, le code pour les redirections dans .htaccess est légèrement différent du standard. Voyez ci-dessus les détails.
La redirection est-elle automatique ?
Tant que vous n’ajoutez pas les codes de redirections, ça ne sera pas automatique et vous risquerez d’avoir votre site en double (HTTP et HTTPS). Ce n’est pas bon pour le SEO…
Mais une fois les codes en place, toute URL en HTTP sera automatiquement redirigée vers l’équivalent en HTTPS.
Où trouver des certificats SSL ?
Il en existe des gratuits (par exemple Let’s Encrypt) et de très nombreux payants. Faites une recherche ici par exemple. Quel que soit le certificat, s’il est bien à jour et bien configuré/installé, vous bénéficierez du cadenas vert (“site sécurisé” / “secure site”).
Et vous ?
Merci de me prévenir si ces exemples de configuration ne fonctionnent pas chez vous (précisez votre serveur et votre cas) ou si vous connaissez les codes à utiliser pour d’autres serveurs que Apache.
Crédits : image d’illustration