Rediriger HTTP vers HTTPS sur WordPress : configurations
Référencement

Rediriger HTTP vers HTTPS sur WordPress : configurations

Redirection 301 HTTP vers HTTPS sur WordPress : Apache, Nginx, LiteSpeed, Cloudflare ou proxy, URL en base avec WP-CLI, contenu mixte, HSTS et tests curl.

Mis à jour le 1er novembre 2026. Ce guide couvre désormais LiteSpeed, Cloudflare et les reverse proxies, la mise à jour des URL en base avec WP-CLI, le contenu mixte, HSTS et une série de tests curl.

Un site accessible en HTTP et en HTTPS présente deux adresses pour chaque page. Les moteurs peuvent indexer l’une ou l’autre. La solution : une redirection permanente (301) de toutes les requêtes HTTP vers HTTPS, des adresses WordPress corrigées, puis des contrôles.

Vérifier le certificat avant toute redirection

Une redirection vers un HTTPS défaillant rend le site inaccessible. Testez d’abord la connexion sécurisée :

curl -sI https://exemple.fr/

La réponse doit être HTTP/2 200 ou HTTP/1.1 200, sans erreur de certificat. Pour lire le sujet, l’émetteur et la date d’expiration :

echo | openssl s_client -connect exemple.fr:443 -servername exemple.fr 2>/dev/null | openssl x509 -noout -subject -issuer -enddate

Le sujet doit correspondre au domaine (et à www) et notAfter doit être dans le futur. Pour installer un certificat, voir notre guide Let’s Encrypt avec Certbot.

Où placer la redirection

Placez la redirection au niveau du serveur, avant PHP : elle couvre aussi les fichiers statiques.

EnvironnementEmplacement recommandéRemarque
Apache avec accès à la configurationVirtualHost du port 80Solution recommandée par la documentation Apache
Apache mutualisé.htaccess à la racineAvant le bloc # BEGIN WordPress
NginxBloc server du port 80return 301
LiteSpeed.htaccessRègles de réécriture au format Apache
Cloudflare ou proxyBord du réseau ou origine, pas les deux sans contrôleAttention aux boucles
Extension WordPressDernier recoursAjoute du code, peut doubler une règle existante

Visez une seule adresse canonique, par exemple https://exemple.fr, atteinte en un seul saut depuis toutes les variantes.

Apache

Dans le VirtualHost

Avec accès à la configuration, la documentation Apache recommande une directive Redirect dans un hôte virtuel dédié au port 80 :

<VirtualHost *:80>
    ServerName exemple.fr
    ServerAlias www.exemple.fr
    Redirect permanent "/" "https://exemple.fr/"
</VirtualHost>

Redirect conserve le chemin : http://exemple.fr/contact/ devient https://exemple.fr/contact/. Vérifiez la syntaxe avec sudo apachectl configtest, puis rechargez le service.

Dans le .htaccess

Sur un hébergement mutualisé, placez ce bloc au début du .htaccess, avant # BEGIN WordPress. Il traite HTTP et la variante www en un seul saut :

RewriteEngine On
RewriteCond %{HTTPS} !=on [OR]
RewriteCond %{HTTP_HOST} ^www\.exemple\.fr$ [NC]
RewriteRule ^ https://exemple.fr%{REQUEST_URI} [L,R=301]

Placée après le bloc WordPress, la règle peut ne jamais s’exécuter. Apache doit aussi autoriser les .htaccess (AllowOverride All ou FileInfo). Notre générateur de redirection .htaccess produit ces variantes.

Nginx

Déclarez un bloc pour le port 80 et, si nécessaire, un bloc HTTPS pour la variante www :

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

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name www.exemple.fr;
    ssl_certificate     /etc/letsencrypt/live/exemple.fr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/exemple.fr/privkey.pem;
    return 301 https://exemple.fr$request_uri;
}

Le certificat doit couvrir www.exemple.fr. Le bloc principal server_name exemple.fr sur le port 443 reste inchangé. Testez avec sudo nginx -t, puis sudo systemctl reload nginx.

LiteSpeed

LiteSpeed Web Server se présente comme un remplaçant direct d’Apache : utilisez la règle .htaccess ci-dessus. Avec OpenLiteSpeed, deux différences comptent :

Derrière Cloudflare ou un reverse proxy

Le principe de la boucle

Derrière un proxy, l’origine reçoit souvent la requête en HTTP, même si le visiteur est en HTTPS. La condition %{HTTPS} !=on reste vraie et l’origine redirige sans fin : ERR_TOO_MANY_REDIRECTS.

Les modes SSL de Cloudflare

ModeConnexion Cloudflare vers l’origineUsage
FlexibleHTTPOrigine sans certificat ; boucle si l’origine redirige vers HTTPS
FullHTTPS, certificat non validéCertificat autosigné
Full (strict)HTTPS, certificat validéRecommandé
Strict (SSL-Only Origin Pull)Toujours HTTPS validéOrigine qui n’accepte que HTTPS

En cas de boucle en mode Flexible, Cloudflare recommande de passer en Full ou Full (strict), ou de supprimer la redirection à l’origine. L’option « Always Use HTTPS » redirige au bord du réseau.

Lire X-Forwarded-Proto

Le proxy transmet le protocole d’origine dans l’en-tête X-Forwarded-Proto. Pour Apache :

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

Pour Nginx, dans le bloc qui reçoit le trafic du proxy :

if ($http_x_forwarded_proto != "https") {
    return 301 https://$host$request_uri;
}

WordPress doit aussi savoir que la requête est sécurisée, sinon il génère des liens en HTTP ou boucle sur l’administration. Ajoutez dans wp-config.php, avant la ligne require_once ABSPATH . 'wp-settings.php'; :

if ( isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] )
    && false !== strpos( $_SERVER['HTTP_X_FORWARDED_PROTO'], 'https' ) ) {
    $_SERVER['HTTPS'] = 'on';
}

Certains proxies envoient une liste comme http,https, d’où la recherche de https dans la valeur. Cet en-tête peut être falsifié : ne vous y fiez que si l’origine n’est joignable qu’à travers le proxy.

Régler WordPress

Dans Réglages > Général, passez en https:// l’« Adresse web de WordPress (URL) » et l’« Adresse web du site (URL) ». Si l’administration est inaccessible, définissez-les dans wp-config.php :

define( 'WP_HOME', 'https://exemple.fr' );
define( 'WP_SITEURL', 'https://exemple.fr' );
define( 'FORCE_SSL_ADMIN', true );

Ces constantes priment sur la base de données. FORCE_SSL_ADMIN impose HTTPS pour la connexion et l’administration ; il remplace FORCE_SSL_LOGIN, obsolète depuis WordPress 4.0.

Mettre à jour les URL en base avec WP-CLI

Les contenus gardent des URL en http:// écrites en dur. N’utilisez ni sed sur un export ni un REPLACE SQL : les données sérialisées seraient corrompues. WP-CLI détecte ces colonnes et les traite en PHP. Sauvegardez, puis faites un essai :

wp db export avant-https.sql
wp search-replace 'http://exemple.fr' 'https://exemple.fr' --skip-columns=guid --dry-run --report-changed-only

Relancez sans --dry-run une fois le rapport validé. Répétez pour http://www.exemple.fr si cette variante existait. Les éditeurs de pages stockent parfois les URL au format JSON échappé ; une seconde passe les couvre :

wp search-replace 'http:\/\/exemple.fr' 'https:\/\/exemple.fr' --skip-columns=guid --dry-run

Ajoutez --all-tables si des extensions utilisent des tables non enregistrées dans WordPress. La colonne guid est exclue : c’est un identifiant, pas une adresse à modifier. Videz ensuite les caches (extension, serveur, CDN).

Corriger le contenu mixte

Une page HTTPS qui charge une ressource en http:// déclenche un avertissement, ou un blocage pour les scripts. Repérez ces ressources dans la console ou l’onglet Réseau des outils de développement. Cherchez aussi dans le thème et les extensions :

grep -rn "http://exemple.fr" wp-content/themes/ wp-content/plugins/

L’en-tête Content-Security-Policy: upgrade-insecure-requests demande au navigateur de charger ces ressources en HTTPS. C’est un filet de sécurité temporaire : si la ressource n’existe pas en HTTPS, elle échoue. Il ne remplace ni la correction des URL ni HSTS. Le même travail sur PrestaShop est décrit dans PrestaShop en HTTPS : contenu mixte et redirections.

HSTS, avec prudence

L’en-tête Strict-Transport-Security demande au navigateur de n’utiliser que HTTPS pendant max-age secondes. Il est ignoré s’il est reçu en HTTP. Une erreur le rend difficile à annuler : le navigateur doit revenir en HTTPS pour lire max-age=0.

Commencez court, puis augmentez par paliers en vérifiant le site à chaque étape : 300 secondes, une semaine (604800), un mois (2592000), puis un an (31536000). Pour Apache, dans le VirtualHost du port 443 (module mod_headers) :

Header always set Strict-Transport-Security "max-age=300"

Pour Nginx, dans le bloc server HTTPS :

add_header Strict-Transport-Security "max-age=300" always;

Sur Nginx, un bloc location qui définit son propre add_header n’hérite pas de celui du server. N’ajoutez includeSubDomains que si tous les sous-domaines répondent en HTTPS. La liste de préchargement (preload) exige au moins un an et includeSubDomains. Le site hstspreload.org la déconseille par défaut, car le retrait prend des mois.

Vérifier avec curl

Sous Windows PowerShell, utilisez curl.exe, car curl y est un alias d’Invoke-WebRequest.

curl -sI http://exemple.fr/
curl -sI http://www.exemple.fr/article-test/
curl -sIL --max-redirs 5 http://www.exemple.fr/
curl -sI https://exemple.fr/ | grep -i strict-transport-security
TestRésultat attendu
http://exemple.fr/301, location: https://exemple.fr/
URL profonde en HTTP301 vers la même URL en HTTPS
Chaîne complète avec -LUne seule 301, puis 200
https://www.exemple.fr/301 vers https://exemple.fr/
En-tête HSTSPrésent, avec le max-age voulu

Si curl signale le nombre maximal de redirections atteint, une boucle subsiste. Sans terminal, notre vérificateur de code d’état HTTP affiche la chaîne de redirections.

Search Console

Une propriété de type domaine couvre déjà les deux protocoles ; sinon, ajoutez la propriété https://exemple.fr/. Soumettez un sitemap en HTTPS, puis inspectez une ancienne URL HTTP. N’utilisez pas l’outil de changement d’adresse : Google indique qu’il ne s’applique pas à un passage de HTTP à HTTPS. Suivez ensuite le rapport « Indexation des pages », puis les Core Web Vitals de WordPress.

Questions fréquentes

Faut-il une redirection 301 ou 302 pour passer en HTTPS ?

Une 301, qui signale un changement définitif. La 302 sert aux redirections temporaires.

Le passage en HTTPS fait-il perdre du référencement ?

Pas si la migration est propre : une seule 301 par URL, liens internes, balises canoniques et sitemap en HTTPS.

Pourquoi ERR_TOO_MANY_REDIRECTS apparaît-il après l’activation ?

L’origine reçoit du HTTP alors que le visiteur est en HTTPS, typiquement derrière Cloudflare en mode Flexible ou un proxy. Passez en Full (strict) ou ajoutez la condition sur X-Forwarded-Proto, puis retestez avec curl -sIL --max-redirs 5.

Faut-il activer HSTS tout de suite ?

Non. Activez-le une fois la redirection et le contenu mixte corrigés, avec un max-age court. Augmentez par paliers, et ne demandez le préchargement que si vous pouvez garantir HTTPS sur tous les sous-domaines à long terme.

Sources

Agence web PrestaShop & WordPress

Agence web spécialisée PrestaShop et WordPress : création, maintenance, sécurité, performance et référencement. Nos tutoriels sont issus de nos interventions sur de vraies boutiques.

L'agence Genisoft → LinkedIn →