Redirections pour WordPress

Redirections d’adresses HTTP pour WordPress

Une redirection d’adresse HTTP permet de charger une page web différente de celle que le visiteur d’un site WordPress a saisi dans la barre d’adresse internet de son navigateur.

La « littérature WordPress » propose souvent des redirections en utilisant le fichier « .htaccess ». C’est simple et efficace, mais cela a aussi ses inconvénients et ses limites.

Il est possible de gérer les redirections dans WordPress, ce qui présente de nombreux avantages. Cet article présente une fonction permettant de définir aisément des règles de redirection.

Haut de page

Redirections avec .htaccess

Un exemple : la gestion des permaliens

À noter : vous trouverez la documentation Apache sur le site officiel.

Regardons le code inséré par WordPress dans .htaccess pour gérer les permaliens :

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
WordPress - gestion des permaliens dans .htaccess

Voici quelques explications sur le fonctionnement de ce code qui utilise les redirections avec conditions :


# BEGIN WordPress et # END WordPress

  • les lignes commençant par le caractère « # » sont des commentaires qui ne déclenchent aucune action mais permettent de faciliter la lecture du code

<IfModule mod_rewrite.c>
RewriteEngine On

</IfModule>

  • un serveur Apache utilise des modules qui s’installent en fonction des besoins des applications.
    « IfModule mod_rewrite.c » vérifie que le module « mod_rewrite », qui gère les redirections,  est installé. S’il l’est, les directives situées entre « <IfModule…> » et « </IfModule> » seront exécutées par Apache;
  • « RewriteEngine On » active le module « mod_rewrite ».

RewriteBase /

  • cette directive indique à Apache que les directives à venir (« RewriteRule« , « RewriteCond« ) vont s’appliquer par rapport au répertoire racine du site (voir une explication sur la directive RewriteBase dans la documentation Apache)

RewriteRule ^index\.php$ – [L]

  • cette directive :
    • regarde si l’adresse demandée est le fichier « index.php » (à la racine du site du fait de la directive « RewriteBase / », par exemple : « dfarnier.fr/index.php »),
    • si non, Apache passe à la directive suivante,
    • si oui, Apache
      • n’effectue pas de redirection (c’est le sens du « – »)
      • n’exécute pas les directives qui suivent dans « .htaccess » (le drapeau « [L] » veut dire Last = dernier)
  • de ce fait, si l’adresse demandée est le fichier « index.php » à la racine du site, Apache lance son exécution

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

  • Apache récupère le « nom de fichier demandé (« {REQUEST_FILENAME}« ), c’est à dire la chaîne de caractère qui suit l’adresse du site (par exemple, après « dfarnier.fr/ »),
    • si cette chaîne ne correspond pas (« !« ) à un fichier (« -f » = file) existant sur le serveur à l’adresse de base, Apache ne doit pas appliquer la règle (« RewriteRule ») qui suit,
    • si cette chaîne ne correspond pas (« !« ) à un répertoire(« -d » = directory) existant sur le serveur à l’adresse de base, Apache ne doit pas appliquer la règle (« RewriteRule ») qui suit,

      RewriteRule . /index.php [L]

  • quelle que soit l’adresse demandée (« .« ), et si les deux conditions précédentes ont été vérifiées (pas un fichier ou un répertoire existant), Apache lance le fichier « index.php » et n’exécute pas les directives qui suivent dans « .htaccess » (« [L]« ),
  • si le fichier ou le répertoire existe, Apache continue à analyser le fichier .htaccess. Si le fichier .htaccess n’a plus de directive, Apache lance l’exécution du fichier ou affiche le contenu du répertoire. Éventuellement, Apache renvoie un code erreur HTTP, dont le célèbre « 404 – Not Found (Ressource non trouvée) ».

En résumé, les directives insérées par WordPress dans le fichier .htaccess afin de gérer les permaliens ont pour effet :

  • d’exécuter le fichier index.php si cela correspond à l’adresse demandée,
  • d’exécuter un fichier s’il existe à la racine du site,
  • d’afficher le contenu d’un répertoire s’il existe à la racine du site,
  • sinon de lancer l’exécution du fichier « index.php » qui va lui même charger puis exécuter WordPress (« index.php » est le lanceur (bootstrap) de WordPress).

Ces directives permettent de lancer WordPress. Si on les retire, WordPress ne sera correctement lancé que dans un cas : celui où l’adresse correspond au fichier « index.php » (exemple : « https://dfarnier.fr/index.php »).

Les redirections simples

Exemple de cas : pour le site situé à l’adresse « https://dfarnier.fr », après une première installation nous avons remplacé :

  • le préfixe identifiant les catégories « category », par le préfixe « sujet » ,
  • l’identifiant de la catégorie « administrer-wordpress » par l’identifiant « administrer-WP »

Voici la directive htaccess correspondante :

redirect 301 /category/administrer-wordpress/ /sujet/administrer-WP/

  • « redirect » : la directive a pour objet de rediriger la page demandée,
  • « 301 » : indique à qui veut accéder à la page (notamment aux moteurs de recherche) que la redirection est permanente; on trouve la liste des codes retour HTTP dans Wikipédia,
  • « adresse à rediriger » : identifiant de page à rediriger par rapport à l’adresse du site (par exemple : « https://dfarnier.fr/category/administrer-wordpress/ « ),
  • « adresse de la redirection » : adresse de la page qu’il faut charger à la place de l’adresse à rediriger (par exemple : si l’adresse demandée est « https://dfarnier.fr/category/administrer-wordpress/ « , Apache redirige vers la page « https://dfarnier.fr/sujet/administrer-WP/ »

À noter : il est possible de remplacer la directive « redirect 301 » par « Redirect permanent ». La directive « Redirect permanent » , et autres codes, est décrite dans la documentation Apache.

Redirections conditionnelles avec expressions régulières

Le code suivant redirige vers l’adresse « https://dfarnier.fr » si le domaine demandé était « www.dfarnier.fr » :

Rewritecond %{HTTP_HOST} ^www.dfarnier.fr$
Rewriterule ^(.*) https://dfarnier.fr/$1 [QSA,L,R=301]

  • si la variable d’en-tête HTTP HTTP_HOST est constituée de la chaîne de caractères www.dfarnier.fr,
  • l’adresse demandée ^(.*)  est concaténée $1 au domaine https://dfarnier.fr/, à laquelle on ajoute [QSA] les données supplémentaires de l’url (la query_string), c’est à dire les paramètres ajoutés à une adresse sous la forme « ?clé1= »valeur1&clé2= »valeur2… »
  • Apache effectue alors une redirection Rewriterule permanente 301 vers l’adresse reconstituée.

^www.dfarnier.fr$, ^(.*) et $1 sont des éléments d’expressions régulières qui est code permettant de définir des conditions complexes sur des chaînes de caractères, d’en extraire tout ou partie pour former une nouvelle chaîne de caractères.

Haut de page

Redirections dans WordPress

WordPress propose la fonction wp_redirect () permettant la redirection d’adresse :

wp_redirect( $location, $status );

  • $location : nouvelle adresse HTTP vers laquelle se rediriger,
  • $status : code de redirection (exemple : « 301 » pour une redirection permanente).

Voici un code qui permet de gérer les redirections les plus courantes dans WordPress notamment lorsque :

Ce code fonctionne avec les « jolis permaliens » (pretty permalinks). Si vous utilisez les permaliens par défaut (?p=nnn »), vous devrez l’adapter en exploitant les « query_vars« ).

  • le nom d’une page ou d’un article a changé,
  • le préfixe de catégorie ou d’étiquette a changé,
  • le nom d’une (ou plusieurs) catégorie et/ou sous-catégorie) a changé,
  • le nom d’une (ou plusieurs) étiquette a changé,
  • on veut renvoyer la page des auteurs, ou de plusieurs auteurs, vers une page spécifique…
add_action( 'template_redirect', 'wpdf_redirect_par_wp', 10 );

function wpdf_redirect_par_wp () {
global $wp;	
	if (is_404()){	//	test si page non trouvée par WordPress
		$wpdf_liste_redirections = array (	
			'/page-a-rediriger' => 'page-redirigee',
	
			'/etiquette*' => 'classe',									
			'/category*' => 'sujet',							
			'/category/sous-categorie*' => 'sujet/nouvelle-categorie'
		);	//	fin tableau des redirections

		//	adresse domaine cible : simplifie l'écriture et aide à la mise au point
		$wpdf_domaine_site_cible = site_url();

		//	récupérer le paramétrage de l'url : "?clé = valeur"
		$wpdf_param_url = (strlen ($_SERVER['QUERY_STRING']))? '?' . $_SERVER['QUERY_STRING'] : '' ;

		//	rechercher les redirections génériques
		$wpdf_explode_request = explode ("/", $wp->request);
		
		$wpdf_nouvelle_adresse = '';	//	variable qui va contenir la nouvelle adresse	
		$wpdf_modif_adresse = false;	//	indique si une redirection a été trouvée dans le tableau


		foreach ($wpdf_explode_request as $wpdf_elt_tableau) {

			if(array_key_exists ($wpdf_nouvelle_adresse . '/' . $wpdf_elt_tableau .'*', $wpdf_liste_redirections)) {
			$wpdf_modif_adresse = true;	//	une redirection a été trouvée
				//	si trouvé dans le tableau, l'élément doit être remplacé dans la nouvelle adresse
				$wpdf_nouvelle_adresse = '/' . $wpdf_liste_redirections[$wpdf_nouvelle_adresse . '/' . $wpdf_elt_tableau.'*'];
			} else {
				// si pas trouvé dans le tableau, l'élément doit être conservé dans la nouvelle adresse
				$wpdf_nouvelle_adresse .= '/' . $wpdf_elt_tableau;
			};	//	fin test si élément indiqué à modifier dans le tableau
		};	// fin boucle sur les éléments d'adresse

		
		if(array_key_exists ($wpdf_nouvelle_adresse, $wpdf_liste_redirections)) {
			$wpdf_modif_adresse = true;	//	une redirection a été trouvée
			$wpdf_nouvelle_adresse = '/' . $wpdf_liste_redirections[$wpdf_nouvelle_adresse];
		};	// fin test si adresse dans liste des redirections
		
		//	si redirection trouvée, rediriger vers la nouvelle adresse
		if ($wpdf_modif_adresse){
			wp_redirect(  esc_url ($wpdf_domaine_site_cible . $wpdf_nouvelle_adresse . '/' . $wpdf_param_url ), 301 );
			exit;	//	toujours ajouter "exit" après une redirection
		}	// fin test si nouvelle adresse trouvée
	};	//	fin si page non trouvée
}	// fin fonction wpdf_redirect_par_wp
Gérer les redirections dans WordPress

Voici comment ce code fonctionne :

add_action( ‘template_redirect’, ‘wpdf_redirect_par_wp’, 10 );

  • add_action permet de déclencher l’exécution d’une fonction personnalisée lorsque le déroulement de WordPress parvient à un crochet (hook) de type action,
  • template_redirect est un crochet de type action, qui se situe juste avant que WordPress ne commence l’affichage d’une page du site,
  • « est la fonction à exécuter par le crochet « template_redirect »,
  • 10 est la priorité associée ; elle correspond à la priorité standard; les priorités de nombre faible sont traités en premier.

global $wp

  • $wp est une variable globale de WordPress que nous allons utiliser pour récupérer l’adresse de la page demandée (« $wp->request« ).

if (is_404())

  • le marqueur conditionnel (Conditional tag) « is_404 () » est vrai quand la page demandée n’a pas été trouvée par WordPress,
    à noter : si WordPress a identifié la page demandée (qui peut être la page d’accueil, un article, une catégorie d’articles…), la fonction « wpdf_redirect_par_wp » n’effectue aucune action et WordPress affiche la page demandée.

 $wpdf_liste_redirections = array (
‘/page-a-rediriger’ => ‘page-redirigee’,

‘/etiquette*’ => ‘classe’,
‘/category*’ => ‘sujet’,
‘/category/sous-categorie*’ => ‘sujet/nouvelle-categorie’
);    //    fin tableau des redirections

  • « $wpdf_liste_redirections » est un tableau dans lequel définir la ou les redirections à réaliser sous la forme :
    • clé : adresse à rediriger (avec un  « / » en début et pas en fin)
      •  » => « 
    • valeur : adresse vers laquelle rediriger (sans  « / » en début et en fin)

On peut définir deux types de redirections :

  • la redirection simple qui permet de remplacer une adresse par une autre
    exemple, la règle :  ‘/page-a-rediriger’ => ‘page-redirigee,
    aura pour effet de remplacer « https://dfarnier.fr/page-a-rediriger/ »
    par « https://dfarnier.fr/page-redirigee/ « 
  • la redirection générique qui ne remplace qu’une partie d’adresse
    exemple la règle : /category*’ => ‘sujet‘,
    aura pour effet de remplacer « https://dfarnier.fr/category/ma-categorie »
    par « https://dfarnier.fr/sujet/ma-categorie »
  • la catégorie générique se reconnaît par le caractère « * » placé à droite de la partie d’adresse à modifier,

  $wpdf_domaine_site_cible = site_url();

  • $wpdf_domaine_site_cible contient l’adresse du site qui sera utilisée pour constituer l’éventuelle adresse de redirection.

$wpdf_param_url = (strlen ($_SERVER[‘QUERY_STRING’]))? ‘?’ . $_SERVER[‘QUERY_STRING’] :  » ;

  • la variable  « $wpdf_param_url  » va contenir les données supplémentaires de l’url (la query_string), c’est à dire les paramètres ajoutés à une adresse sous la forme « ?clé1= »valeur1&clé2= »valeur2… »,
  • cela permettra de réinsérer ces paramètres dans l’éventuelle adresse de redirection.

//    rechercher les redirections génériques
$wpdf_explode_request = explode (« / », $wp->request);

foreach ($wpdf_explode_request as $wpdf_elt_tableau) {
if(array_key_exists ($wpdf_nouvelle_adresse . ‘/’ . $wpdf_elt_tableau .’*’, $wpdf_liste_redirections)) {
$wpdf_modif_adresse = true;    //    une redirection a été trouvée
//    si trouvé dans le tableau, l’élément doit être remplacé dans la nouvelle adresse
$wpdf_nouvelle_adresse = ‘/’ . $wpdf_liste_redirections[$wpdf_nouvelle_adresse . ‘/’ . $wpdf_elt_tableau.’*’];
} else {
// si pas trouvé dans le tableau, l’élément doit être conservé dans la nouvelle adresse
$wpdf_nouvelle_adresse .= ‘/’ . $wpdf_elt_tableau;
};    //    fin test si élément indiqué à modifier dans le tableau
};    // fin boucle sur les éléments d’adresse

  • chaque ligne du tableau « $wpdf_explode_request » contient un élément d’adresse (portions séparées par le caractère « / »),
  • l’adresse de redirection se constitue dans la variable « $wpdf_nouvelle_adresse », élément d’adresse par élément d’adresse ( « $wpdf_elt_tableau ») en vérifiant si des règles génériques doivent s’appliquer (« if(array_key_exists ($wpdf_nouvelle_adresse . ‘/’ . $wpdf_elt_tableau .’*’, $wpdf_liste_redirections)) »)
  • si une règle générique s’applique, la variable « $wpdf_modif_adresse » est positionnée à vrai (true)

if(array_key_exists ($wpdf_nouvelle_adresse, $wpdf_liste_redirections)) {
$wpdf_modif_adresse = true;    //    une redirection a été trouvée
$wpdf_nouvelle_adresse = ‘/’ . $wpdf_liste_redirections[$wpdf_nouvelle_adresse];
};    // fin test si adresse dans liste des redirections

  • l’adresse, éventuellement modifiée par une ou plusieurs règles génériques, est recherchée dans le tableau des règles : if(array_key_exists ($wpdf_nouvelle_adresse, $wpdf_liste_redirections))
    si l’adresse est trouvée comme clé, elle est remplacée par la valeur correspondante ( $wpdf_nouvelle_adresse = ‘/’ . $wpdf_liste_redirections[$wpdf_nouvelle_adresse]; )et la variable « $wpdf_modif_adresse » est positionnée à vrai (true)
  • contrairement aux règles génériques, c’est tout l’adresse qui est modifiée et non une portion d’adresse.

if ($wpdf_modif_adresse){
wp_redirect(  esc_url ($wpdf_domaine_site_cible . $wpdf_nouvelle_adresse . ‘/’ . $wpdf_param_url ), 301 );
exit;    //    toujours ajouter « exit » après une redirection
}    // fin test si nouvelle adresse trouvée

  • si l’adresse a été modifiée par au moins un règle ($wpdf_modif_adresse est à vrai)e, WordPress redirige vers l’adresse constituée par :
    • le domaine cible ($wpdf_domaine_site_cible),
    • la nouvelle adresse après application d’au moins une règle de redirection ($wpdf_nouvelle_adresse),
    • le caractère « / » suivi de la query_string ($wpdf_param_url ).
  • la fonction « esc_url () » est une fonction de sécurité de WordPress qui retire un éventuel code malveillant qui aurait pu être introduit dans une url,
  • nous mettons le statut à 301, pour faire savoir aux moteurs de recherche que la redirection est permanente,
  • ne jamais oublier de faire « exit » après une redirection, sinon deux pages vont s’afficher en même temps car wp_redirect déclenche l’affichage d’une nouvelle page alors qu’une autre est en cours.

Il est possible de vérifier la redirection en utilisant un outil de debug (ici Firebug dans le navigateur Firefox) :

Redirection permanente ("301") depuis WordPress
Redirection permanente (« 301 ») depuis WordPress

Une fois la fonction intégrée à WordPress, dans une extension (plugin ), une extension obligatoire (mu-plugin) ou le fichier « functions.php » associé au thème actif, il suffit d’insérer une ligne dans le tableau $wpdf_liste_redirections_simples » pour créer une règle de redirection.

Si l’utilisation du fichier .htaccess offre souvent l’avantage de la simplicité, je préfère utiliser chaque fois que possible la fonction « wpdf_redirect_par_wp » dans une extension obligatoire car :

  • l’extension obligatoire est systématiquement active et réutilisable d’un site à un autre, simplement  en changeant le tableau des règles de redirection,
  • une fois l’extension ajoutée au site, c’est aussi simple qu’avec .htaccess,
  • cela ne perturbera jamais le fonctionnement d’autres applications adressées sur le même domaine internet (ex : dfarnier.fr),
  • si vous retirez le site WordPress, vous ne risquerez pas de laisser des directives devenues inutiles dans le fichier .htaccess,
  • si le site est déplacé sur un autre type de serveur n’utilisant pas le fichier .htaccess, par exemple NGINX, la solution « extension WordPress » continuera à fonctionner sans modification alors qu’il faudra tout redéfinir pour le nouveau type de serveur, si on utilisait .htaccess,
  • le site s’affiche plus rapidement; cette affirmation peut surprendre car la redirection.htaccess est rapide et se fait avant que WordPress ne soit lancé.
    En fait, la redirection dans WordPress ne s’effectue que si la page demandée n’est pas à la bonne adresse; dans les autres cas, les plus courants, on ajoute uniquement le temps d’un test « is_404 () » sans « balayer » les redirections dans .htaccess.
    Notons aussi que les règles insérées dans le fichier .htaccess seront analysées chaque fois qu’une requête HTTP s’adressera au domaine sur lequel est installé WordPress (par exemple, chaque fois que l’adresse sera « https://dfarnier.fr »).

Redirections WordPress sous conditions

Les redirections peuvent être déclenchées en fonction de conditions. Voici un code qui traite de l’exemple suivant :

  • si la page demandée a pour identifiant (slug) « page-protegee » : is_page(‘page-protegee’)
  • si l’utilisateur n’est pas connecté : !is_user_logged_in(),
  • et si la page n’a pas été publiée depuis moins de 5 jours : ((current_time( ‘timestamp’ ) – get_the_time(‘U’)) / DAY_IN_SECONDS) < 5
  • rediriger vers la page d’accueil  : wp_redirect( site_url(), 301 ).
add_action( 'template_redirect', 'wpdf_redirect_condition', 10 );

function wpdf_redirect_condition () {
	// si c'est la page deamndée et l'utilisateur est connecté
	if (is_page('page-protegee')&& (!(is_user_logged_in())) ){
		
		//	si l'article a été publié depuis plus de 5 jours
		if (((current_time( 'timestamp' ) - get_the_time('U')) / DAY_IN_SECONDS) < 5) {
			//	au lieu de la page demandée, afficher la page d'accueil
			wp_redirect( site_url(), 301 );	
			exit;	//	toujurs faire "exit" après wp_redirect()
		}	//	fin test si publié depuis 50 jours
	}	//	fin test si page protégée et user_logged_in
}	// fin fonction wpdf_redirect_condition
Redirection sur conditions WordPress

Il est clair que ce type de conditions ne peut s’exprimer que dans WordPress et n’est pas réalisable avec .htaccess.

Haut de page

Une réflexion sur « Redirections d’adresses HTTP pour WordPress »

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.