La redirection 301 WordPress sans plugin est possible via trois approches natives : le fichier .htaccess (la plus rapide), la fonction wp_redirect() dans functions.php (la plus portable) ou WP-CLI pour les migrations en masse. En moins de cinq minutes, vous pouvez rediriger une URL obsolète vers sa nouvelle destination sans installer le moindre plugin, sans surcharger votre base de données et sans ralentir votre site. Ce guide couvre chaque méthode avec des exemples copiables, les pièges à éviter et une section de débogage complète.
Pourquoi créer une redirection 301 WordPress sans plugin ?
Un plugin de redirections comme Redirection ou Yoast Premium est pratique, mais il a un coût réel : chaque requête HTTP consulte la base de données pour vérifier si une règle s’applique. Sur un site à fort trafic ou hébergé sur un serveur mutualisé, cette vérification supplémentaire se cumule. Les méthodes natives évitent ce passage par PHP et MySQL lorsque vous utilisez .htaccess, car Apache traite la règle avant même que WordPress soit chargé.
Les cas d’usage courants pour une redirection permanente sans plugin sont les suivants :
- Changement de structure de permaliens (ex. :
/2020/article/vers/article/). - Migration de domaine (HTTP vers HTTPS, ancien domaine vers nouveau).
- Consolidation de pages dupliquées après fusion de contenu.
- Correction de fautes de frappe dans les slugs publiés et indexés.
- Redirections post-suppression de catégorie ou de tag.
Le code 301 indique aux moteurs de recherche que le déplacement est permanent : l’ancienne URL transfère son autorité (PageRank, backlinks) vers la nouvelle. Un 302 ne transmet pas cet héritage et doit être réservé aux redirections temporaires.
Méthode 1 : redirection 301 via le fichier .htaccess
Le fichier .htaccess est situé à la racine de votre installation WordPress (/public_html/.htaccess chez la plupart des hébergeurs). C’est la méthode la plus rapide car elle est traitée par le module mod_rewrite d’Apache avant que PHP ne soit invoqué.
# Ajouter AVANT les règles WordPress existantes
# Redirection d'une URL vers une autre
Redirect 301 /ancien-article/ https://wpadminlab.com/nouvel-article/
# Redirection d'un répertoire entier vers un autre
RedirectMatch 301 ^/ancienne-categorie/(.*)$ https://wpadminlab.com/nouvelle-categorie/$1
# Redirection d'un ancien domaine vers le nouveau (dans .htaccess de l'ancien)
RewriteEngine On
RewriteCond %{HTTP_HOST} ^ancien-domaine.com$ [NC]
RewriteRule ^(.*)$ https://nouveau-domaine.com/$1 [R=301,L]
Règle d’ordre importante : placez vos redirections personnalisées au-dessus du bloc # BEGIN WordPress généré automatiquement. Si vous les insérez après ce bloc, les règles WordPress peuvent intercepter la requête avant les vôtres.
Pour vérifier que mod_rewrite est actif sur votre serveur :
# Via WP-CLI
wp server --info | grep mod_rewrite
# Via PHP (dans un fichier temporaire à supprimer ensuite)
echo phpinfo() | grep -i "mod_rewrite"
# Via curl (cherchez l'en-tête Location dans la réponse)
curl -I https://wpadminlab.com/ancien-article/
Si votre hébergeur utilise LiteSpeed (o2switch, par exemple), les directives Redirect et RedirectMatch sont nativement supportées. La directive RewriteRule avec [R=301,L] fonctionne également grâce à la compatibilité .htaccess de LiteSpeed.
Méthode 2 : wp_redirect() dans functions.php
La fonction wp_redirect() est la méthode WordPress pure. Elle s’insère dans le fichier functions.php de votre thème enfant (ou dans un plugin mu-plugin pour une solution indépendante du thème). Elle est particulièrement adaptée aux redirections conditionnelles basées sur des données WordPress (rôle utilisateur, paramètre de requête, type de post).
// Dans functions.php du thème enfant
function wpal_redirections_personnalisees() {
// Redirection d'une URL précise
if ( is_page( 'ancien-slug' ) ) {
wp_redirect( home_url( '/nouveau-slug/' ), 301 );
exit;
}
// Redirection basée sur un paramètre GET
if ( isset( $_GET['ref'] ) && $_GET['ref'] === 'newsletter' ) {
wp_redirect( home_url( '/offre-speciale/' ), 301 );
exit;
}
}
add_action( 'template_redirect', 'wpal_redirections_personnalisees' );
Le exit; après wp_redirect() est obligatoire. Sans lui, WordPress continue d’exécuter le code et peut envoyer des en-têtes contradictoires, ce qui provoque une boucle de redirection ou un contenu affiché après le header 301.
Pour une URL codée en dur (pas liée à une page WordPress), préférez la vérification via $_SERVER['REQUEST_URI'] :
function wpal_redirections_uri() {
$uri = $_SERVER['REQUEST_URI'];
// Redirection d'un ancien slug vers un nouveau
$redirects = array(
'/ancienne-page/' => '/nouvelle-page/',
'/article-efface/' => '/categorie/',
'/promo-2024/' => '/promotions/',
);
if ( array_key_exists( $uri, $redirects ) ) {
wp_redirect( home_url( $redirects[ $uri ] ), 301 );
exit;
}
}
add_action( 'template_redirect', 'wpal_redirections_uri' );
Cette approche est portable : si vous changez de thème, il suffit de copier la fonction dans le nouveau functions.php ou dans un mu-plugin.
Méthode 3 : mu-plugin pour des redirections durables
Un must-use plugin (mu-plugin) est chargé automatiquement par WordPress avant les plugins classiques, sans activation ni désactivation possible par l’administrateur. C’est la méthode recommandée pour des redirections critiques qui ne doivent pas être supprimées par erreur.
// Fichier : /wp-content/mu-plugins/wpal-redirections.php
/*
Plugin Name: Redirections permanentes wpadminlab
Description: Redirections 301 sans plugin tiers, gérées comme mu-plugin.
Version: 1.0
*/
add_action( 'template_redirect', function() {
$redirects = array(
'/page-supprimee/' => 'https://wpadminlab.com/nouvelle-page/',
'/ancienne-categorie/' => 'https://wpadminlab.com/wordpress/',
'/tutoriel-obsolete-2020/' => 'https://wpadminlab.com/tutoriel-2026/',
);
$uri = strtok( $_SERVER['REQUEST_URI'], '?' ); // Ignorer les paramètres GET
if ( isset( $redirects[ $uri ] ) ) {
wp_redirect( $redirects[ $uri ], 301 );
exit;
}
} );
Le dossier /wp-content/mu-plugins/ doit être créé manuellement s’il n’existe pas. Les fichiers PHP déposés à la racine de ce dossier sont chargés automatiquement, dans l’ordre alphabétique.
Méthode 4 : redirections en masse avec WP-CLI
Lors d’une migration ou d’un changement de structure de permaliens, vous pouvez avoir des dizaines ou des centaines d’URLs à rediriger. WP-CLI permet de gérer cela par script sans toucher à l’interface graphique.
# Lister les règles de réécriture existantes
wp rewrite list --path=/home/wami5543/public_html/
# Régénérer les règles de réécriture (après migration)
wp rewrite flush --hard
# Mettre à jour le slug d'un post et créer une redirection automatique
# (WordPress crée la redirection via old_slug si Permalinks actifs)
wp post update 123 --post_name="nouveau-slug"
# Modifier les permaliens d'une série de posts avec un script bash
for id in 100 101 102 103; do
wp post update $id --post_name="nouveau-slug-$id" --path=/home/wami5543/public_html/
done
Astuce : quand vous modifiez le slug d’un article publié dans WordPress (via l’interface ou WP-CLI), WordPress stocke automatiquement l’ancien slug dans la table wp_postmeta (meta-clé _wp_old_slug) et crée une redirection interne. C’est suffisant pour les migrations simples sans plugin.
Pour des migrations complexes depuis un CMS tiers, exportez votre liste d’anciens URLs dans un fichier CSV et injectez les règles dans .htaccess via un script Python ou bash :
#!/usr/bin/env python3
# Générer des règles .htaccess depuis un CSV (ancien_url, nouvel_url)
import csv
with open('redirections.csv') as f:
reader = csv.reader(f)
print("RewriteEngine On")
for row in reader:
ancien, nouveau = row[0].strip(), row[1].strip()
print(f"RedirectMatch 301 ^{ancien}$ {nouveau}")
Gérer les redirections de catégories, tags et archives WordPress
La suppression ou le renommage d’une catégorie WordPress ne crée pas automatiquement de redirection 301. Si vous avez supprimé la catégorie « Tutoriels 2020 » et créé « Tutoriels », les anciens URLs /category/tutoriels-2020/ retournent une 404. Voici comment corriger cela via functions.php :
function wpal_redirect_anciennes_categories() {
// Redirection d'une ancienne catégorie vers une nouvelle
$old_cat_slug = 'tutoriels-2020';
$new_cat_url = home_url( '/category/tutoriels/' );
if ( is_category( $old_cat_slug ) ) {
wp_redirect( $new_cat_url, 301 );
exit;
}
// Redirection des tags supprimés
if ( is_tag( 'ancien-tag' ) ) {
wp_redirect( home_url( '/category/wordpress/' ), 301 );
exit;
}
}
add_action( 'template_redirect', 'wpal_redirect_anciennes_categories' );
Pour les changements de structure de permaliens (par exemple, passer de /%year%/%postname%/ à /%postname%/), une seule règle .htaccess peut gérer toutes les anciennes URLs en une fois :
# Migration de /%year%/%postname%/ vers /%postname%/
RewriteEngine On
RewriteRule ^[0-9]{4}/[0-9]{2}/(.*)$ /$1 [R=301,L]
# Migration de /blog/article/ vers /article/
RewriteRule ^blog/(.*)$ /$1 [R=301,L]
Après toute modification de .htaccess, videz le cache de votre serveur. Sur LiteSpeed/o2switch, consultez notre guide sur comment vider le cache WordPress sans plugin pour les méthodes adaptées à votre hébergement.
Tester et déboguer vos redirections 301 WordPress
Une redirection mal configurée peut créer des boucles infinies (Too Many Redirects), des chaînes de redirections (301 vers 302 vers 200) qui diluent le PageRank, ou des redirections vers la mauvaise URL. Voici les outils natifs pour tester avant de mettre en production :
# curl : suivre les redirections et afficher chaque étape
curl -L -I --max-redirs 5 https://wpadminlab.com/ancienne-url/
# Vérifier le code HTTP de la réponse finale
curl -o /dev/null -s -w "%{http_code} - %{redirect_url}
" https://wpadminlab.com/ancienne-url/
# Tester une chaîne de redirections en détail
curl -v -L https://wpadminlab.com/ancienne-url/ 2>&1 | grep -E "HTTP|Location"
Les erreurs les plus fréquentes et leurs solutions :
- Boucle infinie : la destination de la redirection contient elle-même une règle qui redirige vers l’origine. Vérifiez que vos règles
.htaccessne se chevauchent pas, et ajoutez une conditionRewriteCond %{REQUEST_URI} !^/nouvelle-url/. - Redirection vers HTTPS échoue : le certificat SSL n’est pas installé ou le port 443 est bloqué. Vérifiez avec
curl -I https://...et l’outil de diagnostic SSL de votre hébergeur. - La règle .htaccess ne prend pas effet : le cache LiteSpeed ou Varnish sert l’ancienne réponse. Purgez le cache et testez avec un paramètre
?nocache=1ajouté à l’URL. - wp_redirect() ne fonctionne pas : vérifiez que l’action
template_redirectest bien utilisée (pasinit), que leexit;est présent et qu’aucun output (même une ligne vide en début de fichier PHP) n’a été envoyé avant la redirection.
Pour aller plus loin dans la configuration des URLs WordPress, consultez notre générateur .htaccess WordPress qui propose des règles optimisées pour la performance et la sécurité. Si vous cherchez à sécuriser l’accès à votre administration, notre guide sur changer l’URL de wp-admin sans plugin complète parfaitement cette démarche.
Redirections 301 et SEO : bonnes pratiques 2026
Google transfère entre 90 et 99% de l’autorité d’une page via une redirection 301, selon la documentation officielle Search Central. Les points de vigilance SEO spécifiques à WordPress :
- Chaînes de redirections : évitez A vers B vers C. Chaque maillon supplémentaire dilue le signal et ralentit le chargement. Consolidez en une seule règle A vers C.
- Mise à jour du sitemap : après avoir créé vos redirections, régénérez le sitemap pour qu’il ne contienne que les URLs finales. Un sitemap qui pointe vers des URLs redirigées est un signal négatif de qualité.
- Mise à jour du maillage interne : les liens internes qui pointent vers l’ancienne URL continuent de fonctionner (la redirection 301 les corrige côté navigateur), mais Google préfère des liens directs vers la destination finale. Mettez à jour vos anciens articles.
- Temps de traitement Googlebot : après une migration avec de nombreuses redirections, attendez 2 à 4 semaines avant que Google mette à jour son index. Soumettez les nouvelles URLs via Google Search Console pour accélérer le recrawl.
- Canonicals : une redirection 301 et une balise
<link rel="canonical">ne sont pas équivalentes. La redirection 301 est plus forte pour la consolidation d’autorité : préférez-la à un canonical seul lorsque vous souhaitez supprimer définitivement une URL.
Selon la documentation Apache mod_rewrite, les règles RewriteRule sont appliquées dans l’ordre d’apparition dans .htaccess, et la première règle correspondante avec le flag [L] arrête le traitement. Planifiez vos règles du cas le plus spécifique au plus général.
FAQ : redirection 301 WordPress sans plugin
Quelle est la différence entre une redirection 301 et une redirection 302 dans WordPress ?
Une redirection 301 est permanente : elle transfère l’autorité SEO (PageRank) vers la nouvelle URL et indique aux moteurs de recherche de mettre à jour leur index. Une redirection 302 est temporaire : elle ne transfère pas l’autorité et Googlebot conserve l’ancienne URL dans son index. Dans WordPress, wp_redirect( $url, 301 ) envoie un 301 et wp_redirect( $url, 302 ) envoie un 302. Utilisez toujours le 301 pour les déplacements définitifs et le 302 uniquement pour les redirections temporaires (maintenance, tests A/B courts).
Faut-il vider le cache WordPress après avoir ajouté une règle .htaccess ?
Oui, le cache de page (LiteSpeed, WP Rocket, W3 Total Cache) peut servir l’ancien HTML avec les anciens liens pendant plusieurs heures après la modification du .htaccess. Pour tester immédiatement votre redirection sans cache, ajoutez un paramètre arbitraire à l’URL testée (?test=1) ou utilisez un navigateur en mode incognito. Pour une purge complète via WP-CLI : wp cache flush.
Une redirection 301 WordPress sans plugin est-elle aussi fiable qu’avec un plugin ?
Oui, et souvent plus fiable. La méthode .htaccess est traitée par Apache avant le démarrage de PHP : elle ne peut donc pas être affectée par une erreur PHP ou une panne WordPress. La méthode wp_redirect() dans un mu-plugin est chargée avant tous les plugins normaux et ne peut pas être désactivée par erreur via l’interface d’administration. Les plugins de redirections ajoutent une couche de complexité (base de données, interface) utile uniquement si vous gérez plus de 50 redirections ou si plusieurs personnes doivent les administrer sans accès au code.
Comment créer une redirection 301 pour toutes les pages d’un ancien domaine vers un nouveau domaine WordPress ?
Ajoutez ces trois lignes dans le .htaccess de l’ancien domaine, au-dessus du bloc WordPress existant : RewriteEngine On, puis RewriteCond %{HTTP_HOST} ^ancien-domaine.com$ [NC], puis RewriteRule ^(.*)$ https://nouveau-domaine.com/$1 [R=301,L]. Cette règle capture le chemin complet ($1) et le reporte sur le nouveau domaine, préservant la structure des URLs. Vérifiez que votre hébergeur autorise mod_rewrite et les redirections inter-domaines.
Pourquoi ma redirection 301 WordPress crée-t-elle une boucle infinie ?
Une boucle infinie (erreur « Too many redirects » dans le navigateur) se produit quand la destination de la règle déclenche la même règle ou une autre règle qui renvoie vers l’origine. Causes fréquentes : la règle HTTPS dans .htaccess appliquée à un serveur qui sert déjà du HTTPS (doublon), une condition is_page() dans functions.php qui matche aussi la page de destination, ou un conflit entre les règles du plugin cache et les règles personnalisées. Solution : testez chaque règle isolément avec curl -I et ajoutez des conditions d’exclusion (RewriteCond %{HTTPS} on pour la redirection HTTPS, ou vérifiez l’URL de destination dans wp_redirect()).
Commentaires (0)
Laisser un commentaire
Les commentaires sont modérés. Questions WordPress, cybersécurité ou dev web bienvenues.