Nous en parlions dans notre article du mois dernier, une modification de la structure des URL demande la mise en place d’un plan de redirection pour établir les correspondances entre les anciennes et les nouvelles URL. Ce plan de redirection permettra de conserver le positionnement des pages du site via un ensemble de redirections 301. Une fois ce plan créé, il vous faudra implémenter les redirections sur votre site. Nous allons passer en revue dans cet article (le cinquième de notre série sur la migration de site web) la mise en place des redirections sur différents types de serveur, en fonction de votre environnement web.

Redirections serveur ou applicatif ?

Les redirections 301 peuvent être effectuées directement sur le serveur Web hébergeant votre site (ex : Apache, Nginx, …), mais également via l’applicatif (CMS). Certains plugins comme « Redirection » pour WordPress (https://fr.wordpress.org/plugins/redirection/) ou encore le module « Redirect » de Drupal (https://www.drupal.org/project/redirect) pourront vous permettre de gérer l’ensemble de vos redirections via l’interface de votre système de gestion de contenu.

Mais il est déconseillé d’utiliser ce type de plugin dans le cadre d’une migration : bien que la gestion puisse être facilitée par ces interfaces, il faut garder à l’esprit que passer par le langage serveur n’est pas optimal en terme de performances. En effet, chaque redirection passera par le CMS et son langage de programmation (ex : langage PHP) ainsi qu’une requête en base de données pour trouver la correspondance d’URL déjà enregistrée (ex : MySQL), ce qui ne fera qu’alourdir la plateforme, en rajoutant des étapes intermédiaires.


Fig. 1. Architecture d'un site Web avec le serveur Web, le langage de programmation puis la base de données.

Comme vous pouvez le constater sur la figure 1, placer les redirections directement au niveau du serveur Web (Apache sur le schéma) sera le chemin le plus direct pour effectuer l’ensemble des redirections 301 entre le navigateur des internautes et le site Web. Nous allons voir dans cet article la meilleure façon d’implémenter les redirections sur les serveurs les plus courants, à savoir Apache, NginX, et Microsoft IIS (acronyme de « Internet Information Services »).

Redirections sur Microsoft IIS

Les règles de réécriture de IIS fonctionnent sur un principe clé/valeur (URL à réécrire / URL réécrite) avec un ensemble de règles regroupées dans une RewriteMap, pour laquelle une action sera définie (redirection permanente dans notre cas) entre les différentes paires de clé/valeur. Dans un premier temps, il vous faudra ouvrir l’interface de IIS via le « Gestionnaire de services Internet » et lancer le module « URL Rewrite » (après avoir sélectionné le site sur lequel vous souhaitez ajouter des redirections dans la colonne de gauche). Le module est téléchargeable à l’adresse suivante si il n’apparait pas dans votre interface : https://www.microsoft.com/en-us/download/details.aspx?id=47337


Fig. 2. Lancement du module "URL Rewrite" de IIS.

Redirections page à page

Nous allons maintenant créer une RewriteMap afin de rassembler l’ensemble de nos redirections sous une même action :


Fig. 3. Ajouter d'une nouvelle règle pour gérer la RewriteMap.

Il faudra ensuite sélectionner le type d’action « Redirect » et définir le nom de notre plan de redirection (ex : « redirectionsstatiques » ):


Fig. 4. Choix du type d'action et du nom du plan de redirection.


Vous pourrez éditer la règle par la suite afin de paramétrer certains détails, comme le fait de conserver (ou non) la chaine de paramètres lors des redirections (« Append query string »). Ainsi, il sera utile de créer deux « RewriteMap » pour vos redirections : une contenant les redirections pour lesquelles la chaîne de paramètres devra être conservée, et une autre pour les redirections pour lesquelles la chaine de paramètres devra être supprimée.


Fig. 5. Edition de la règle relative à la RewriteMap crée qui intercepte toutes les URL avec l’expression régulière « (.+) ».

Une fois dans la fenêtre relative à votre « RewriteMap » (lien « View Rewrite Maps » dans la colonne de droite du module URL rewrite), puis en ayant sélectionné la RewriteMap déjà crée (« redirectionsstatiques » dans notre cas), vous pourrez ajouter vos différentes redirections 301 via le lien de la colonne de droite « Add Mapping Entry » :


Fig. 6. Ajout d'une règle de redirection à la RewriteMap "redirectionsstatiques".

Bien que l’interface graphique soit confortable pour ajouter l’ensemble de redirections, cela peut devenir vite ingérable pour un grand nombre de redirections. Dans ce cas, il sera plus rapide de les placer directement dans un fichier spécifique utilisant la syntaxe de IIS.

Fichier de redirection

En éditant le fichier « web.config » qui se situe dans le répertoire de votre site Web sur votre serveur (C:inetpubwwwroot), vous pourrez voir les différentes règles générées via les étapes précédentes :

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rewriteMaps>
<rewriteMap name="redirectionsstatiques">
<add key="/ancienne-url" value="/nouvelle-url" />
<add key="/test1" value="/test2.html" />
</rewriteMap>
</rewriteMaps>
<rules>
<rule name="Redirect rule1 for redirectionsstatiques">
<match url=".*" />
<conditions>
<add input="{redirectionsstatiques:{REQUEST_URI}}" pattern="(.+)" />
</conditions>
<action type="Redirect" url="{C:1}" appendQueryString="false" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>

Afin de placer l’ensemble des règles de redirection dans un fichier indépendant, il vous faudra déplacer le bloc <RewriteMaps> dans un nouveau fichier que l’on nommera « redirections.config » , et que l’on enregistrera au même emplacement que le fichier web.config (C:inetpubwwwroot dans notre cas). Il vous faudra ensuite appeler le contenu de ce nouveau fichier à partir du fichier web.config en ajoutant sous la ligne 4 (<rewrite>), la ligne suivante : <rewriteMaps configSource="redirections.config" />

Nous aurons ainsi deux fichiers :

Il vous suffira ensuite de placer l’ensemble de vos règles de redirection dans le fichier « redirections.config » sous la forme :

<add key="/ancienne-url" value="/nouvelle-url" />
<add key="/ancienne-url-2" value="/nouvelle-url-2" />

Redirections dynamiques

Pour la mise en place de règles dynamiques (ex : modification du nom d’un répertoire lors de la refonte), vous pourrez l’ajouter en mode texte directement dans le fichier web.config. Si l’on doit rediriger toutes les URL commençant par « /blog / » vers le nouveau répertoire « /magazine/ », voici la règle à ajouter dans la section <rules>  de web.config :

<rule name="blog vers magazine" stopProcessing="true">
<match url=".*" />
<conditions logicalGrouping="MatchAny">
<add input="{REQUEST_URI}" pattern="/blog/(.*)" />
</conditions>
<action type="Redirect" appendQueryString="false" url="/magazine/{C:1}" redirectType="Permanent" />
</rule>

Dans cette règle, on intercepte toutes les URL, et pour celles qui commencent par « /blog/ », on récupère la suite de l’URL via l’expression régulière « (.*) » (à savoir n’importe quel caractère répété 0 ou plusieurs fois), et on redirige ensuite vers le répertoire « /magazine /» suivi de la suite de l’URL récupérée dans le premier ensemble précédemment défini par des parenthèses avec la variable {C :1} (le chiffre 1 correspond au premier ensemble défini par une expression régulière). On pourra ensuive visualiser la règle crée dans l’interface de IIS :


Fig. 8. Affichage de l'ensemble des règles de réécriture configurées.

Il sera également possible d’effectuer des redirections en fonction du contenu de la chaine de paramètres en interceptant via les expressions régulières la variable {QUERY_STRING} (colonne « Input » ci-dessus). Cela peut être utile dans le cas où vos anciennes URL sont sous la forme index.php?categorie=bougies, et que vous souhaitez les rediriger vers des URL sous la forme /categorie/bougies.

Vous pourrez maintenant générer vos règles de redirection pour Microsoft IIS soit via l’interface de Windows, soit directement dans le fichier de configuration « web.config » pour plus de souplesse.

Redirections sur Nginx

La mise en place de redirections sur le serveur Nginx ne peut s’effectuer que par l’édition du fichier de configuration de votre nom de domaine (et non d’une interface graphique à l’inverse de Microsoft IIS). Ce fichier se trouve dans le répertoire « /etc/nginx/nginx.conf » (ou éventuellement « /opt/nginx/conf/ »). Si vous utilisez des hôtes virtuels sur votre serveur, dans le cas d’un serveur qui gérerait plusieurs noms de domaines, il est possible que le fichier de configuration à modifier se trouve à l’emplacement suivant : « /etc/nginx/sites-available/votredomaine.com ».


Fig. 9. Logo du serveur Web Nginx.

Redirections page à page

Pour intégrer des règles de redirection sur votre serveur, il faudra les placer dans le fichier de configuration mentionné ci-dessus avec la syntaxe suivante :

rewrite ^/ancienne-url$ https://www.votredomaine.com/nouvelle-url permanent;

Le flag permanent permet d’effectuer une redirection 301, à l’inverse du flag « redirect » qui provoquerait une redirection temporaire 302. Dans le cas où vous souhaiteriez supprimer la chaîne de paramètre si l’URL en comportait une, il vous faudra ajouter un point d’interrogation à la fin de l’URL redirigée, ce qui donnera pour la règle précédente :

rewrite ^/ancienne-url$ https://www.votredomaine.com/nouvelle-url? permanent;

Les règles pourront se mettre les unes à la suite des autres. Si le nom de domaine reste identique, vous pourrez utiliser le chemin relatif pour alléger votre fichier de configuration :

rewrite ^/ancienne-url$ /nouvelle-url? permanent;

Si vous avez de nombreuses règles, il peut être utile de les placer dans un fichier indépendant. Dans ce cas, il vous faudra un include à l’extérieur du bloc « server » de votre fichier de configuration, ainsi qu’une règle globale qui sera utilisée pour le fichier de redirection :

include plan-redirection.conf;
server {
listen 80;
[…]
if ( $mesredirections) {
return 301 $mesredirections;
}
}

Vous pourrez ainsi placer directement vos correspondances en provenance d’un fichier Excel dans l’include « plan-redirection.conf » sous cette forme :

map $request_uri $mesredirections {
/ancienne-url          /nouvelle-url;
/ancienne-url-2      /nouvelle-url-2;
/blog/       /magazine/;
….
}

Attention, la syntaxe est spécifique pour les expressions régulières. Il faudra précéder chaque URL à rediriger par le signe « ~ », ou encore le signe « ~* » si vous ne souhaitez pas tenir compte de la casse. Ex pour le déplacement du répertoire /en/pictures/ ou /de/pictures/ vers /en/images ou /de/images/ :

~/(?<langue>(en|de))/pictures/   /$langue/images/;

« ?<langue> » sert à définir le nom de l’expression régulière suivante qui sera récupérée via une variable dans l’URL redirigée.

Redirections dynamiques

La mise en place de redirections dynamiques est similaire à celle utilisée sur Apache. Pour reprendre l’exemple de redirection dynamique cité pour Microsoft IIS, voici la règle qui redirigera les URL du répertoire « /blog/ » vers « /magazine/ » :

rewrite ^/blog/(.*)$ /magazine/$1 permanent;

/blog/article1.html sera alors redirigé vers /magazine/article1.html

Redirection en fonction de la chaine de paramètres

Si vous devez rediriger certaines anciennes URL en fonction de la valeur d’une variable dans la chaîne de paramètres, il vous faudra détecter son contenu via une condition IF. Voici un exemple pour rediriger une URL contenant un paramètre de pagination (si l’URL /produits?p=10 doit être redirigé vers /nos-produits?page=10) :

  if ($args ~* "^page=(d+)") {
rewrite ^produits$ /nos-produits?page=$1 permanent;
}

Si vous êtes familier avec la syntaxe des serveurs Apache, voici une page vous détaillant les correspondances entre les règles de réécriture de Nginx vs Apache : http://nginx.org/en/docs/http/converting_rewrite_rules.html

Gardez également à l’esprit le fait que votre serveur Nginx devra être redémarré afin que les redirections soient prises en compte.

Redirections sur Apache

Les redirections sur le serveur Apache peuvent être insérées dans les fichiers .htaccess, qui sont des extensions de la configuration d’Apache, et qui se placent au niveau des répertoires dans lesquelles on souhaite voir les règles s’exécuter. Bien que ces fichiers soient très utiles quand vous n’avez pas accès à la configuration du serveur, Apache déconseille de les utiliser car ils ralentissent les performances du serveur.


Fig. 10. Logo du serveur Web Apache.

En effet, pour chaque requête sur le serveur, Apache détecte la présence ou non de ces fichiers dans les répertoires de l’élément demandé, et si un fichier .htaccess est trouvé, alors les règles du fichier sont testées (et parfois exécutées) pour chaque requête. Pour une page Web composée d’une centaine d’éléments appelés par un internaute, multiplié par le nombre d’internautes simultanés, cela peut vite limiter les performances du site.

Afin de désactiver les fichiers .htacces dans le cas où vous auriez un accès à la configuration de votre serveur, il vous faudra modifier la directive AllowOverride dans la configuration d’apache (générallement /etc/apache2/apache.conf) :

AllowOverride None

Vous pourrez dans ce cas placer vos redirections directement dans le fichier de configuration d’Apache, les fichiers .htaccess restant malgré tout utiles dans le cas où vous n’avez pas accès au fichier de configuration du serveur Apache (apache2.conf ou httpd.conf).

Redirections page à page

Pour effectuer des redirections page à page, la directive recommandée est RedirectPermanent (moins lourde que RewriteRule) :

RedirectPermanent /ancienne-url /nouvelle-url

Vous pourrez ainsi placer les redirections les unes en dessous des autres, en prenant soin de les placer par ordre de priorité, pour que les URL les plus demandées soient rapidement trouvées.

Si vous souhaitez supprimer les chaînes de paramètres lors de vos redirections (ex : /ancienne-url?track=10 à /nouvelle-url), il vous faudra alors passer par la directive RewriteRule.

Sur la version d’Apache 2.2 (et inférieures), voici la façon dont devra être intégrée la redirection pour supprimer les paramètres d’URL :

RewriteRule ^ancienne-url /nouvelle-url? [R=301,L]

Sur la version d’Apache 2.4 (et supérieures), vous pourrez utiliser le drapeau [QSD] (pour Query String Discard) :

RewriteRule ^ancienne-url /nouvelle-url [R=301,L,QSD]

Redirections dynamiques

Les redirections dynamiques via des expressions régulières peuvent s’effectuer avec la directive RedirectMatch, ou encore la directive RewriteRule qui permettra d’aller plus loin. Pour reprendre l’exemple cité pour IIS et Nginx, voici la règle de redirection pour rediriger un ensemble d’URL d’un répertoire vers un autre :

RedirectMatch 301 /blog/(.*)$ /magazine/$1

Ici, le premier ensemble défini par une expression régulière (premier groupe de parenthèses) pourra être récupéré sur l’URL finale via la variable $1.

Redirection en fonction de la chaine de paramètres

Pour rediriger des URL en fonction du contenu des chaines de paramètres, il vous faudra passer par la directive « RewriteRule », couplée à une condition de réécriture (RewriteCond). Attention, l’utilisation de RedirectPermanent ne fonctionnera pas pour rediriger des URL comportant des chaines de paramètres :

RedirectPermanent /ancienne-url?param=value /nouvelle-url?param=value ne sera pas interprétée par le serveur. Voici un exemple pour rediriger une URL contenant un paramètre de pagination (si l’URL /produits?p=10 doit être redirigé vers /nos-produits?page=10) :

RewriteCond %{QUERY_STRING} ^p=([0-9]+)$
RewriteRule ^produits$ /nos-produits?page=%1 [R=301,L]

/produits?p=4 sera donc redirigé via une redirection 301 vers /nos-produits?page=4.

On utilisera dans ce cas la variable %1 (et non $1) pour récupérer la valeur définie par une expression régulière dans la condition de réecriture « RewriteCond ».

Conclusion : il est capital de bien organiser ses URL !

Comme vous avez pu le constater au travers de ces différents exemples de redirections dans le cadre d’une refonte avec changement des URL, l’implémentation des redirections se fait avec de nombreuses spécificités pour les URL en fonction de leur format (règles dynamiques, suppression des chaînes de paramètres, redirection en fonction des chaînes de paramètres, etc.)

Il est donc primordial de qualifier préalablement l’ensemble de vos URL à migrer comme vu dans les articles précédents de cette série, afin de faciliter l’intégration de vos redirections sur le serveur de votre site. Sur ce, bonnes redirections et bonne chance !


Aymeric Bouillat
Consultant SEO Senior, SEO Hackers (https://seohackers.fr/)