Comprendre les redirections de Wordpress

Comment s'y prend Wordpress pour rediriger les accès à un contenu de base de données à partir des URLs?

Wordpress inclut sur chaque hébergement un code de réécriture d'URL dans le fichier .htaccess qui remplace une URL dynamique par une URL statique, lorsque le webmaster/blogueur à choisi cette option. Cela est fait par le serveur, mais il fait plus que cela.

Le code .htaccess

# BEGIN WordPress
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Voila ce qu'il signifie en détail...

# BEGIN WordPress
# END WordPress

De simples commentaires signalant le début et la fin du code de réécriture d'URL.

<IfModule mod_rewrite.c>
</IfModule>

Expression conditionnelle: le code inclu entre ces deux balises est exécuté seulement si l'URL rewritting est permise par l'hébergeur et dans ce cas le module mod_rewrite doit être disponible.

RewriteEngine On

Active le moteur de réécriture d'URL.

RewriteBase /

Indique explicitement que la racine du site est "/", ce qui n'est pas le cas par défaut pour la plupart des hébergements Unix: la base du site est l'emplacement des fichiers, quelque chose comme /home/utilisateur/www/.

Cette directive introduit une différence entre PHP et le serveur: pour PHP, la racine reste l'emplacement du répertoire et il faut utiliser les variables PHP pour connaître la racine du site (voir le script Bioloide pour une application pratique).

La base étant ainsi définie, on peut utiliser dans les pages des adresses relatives comme par exemple /mapage.html.

RewriteCond %{REQUEST_FILENAME} !-f

Une précondition pour la directive qui suivra.

Elle empêche la redirection automatique sur index.php, ce qui est le cas par défaut, lorsque l'URL correspond à un fichier réel.

REQUEST_FILENAME est une variable Apache qui représente le chemin réel dans le système de fichier sur le serveur.

%{} ce code est la façon pour Apache de désigner une variable.

! ce symbole forme la négation du filtre qui suit.

-f précise qu'il s'agit d'un fichier et !-f indique que ce ne doit pas être un fichier.

-d précise qu'il s'agit d'un répertoire et !-d l'inverse.

Donc la condition exclut les URL correspondant à un fichier réel sur le site, tandis que:

RewriteCond %{REQUEST_FILENAME} !-d

exclut les sous-répertoires.

RewriteRule . /index.php [L]

La commande RewriteRule demande le remplacement de l'expression régulière, en l'occurence un point, par l'adresse /index.php (sauf si c'est un fichier ou répertoire réels).

Le point représentant tout caractère ou séquence de caractère, toute URL est redirigée sur index.php.

[] ajoute une règle pour le serveur.
L signifie Last, la règle est la dernière à être appliquée.

Ainsi la règle complète redirige toutes les URLs sur /index.php sauf si elles correspondent à des fichiers ou répertoires réels.

Nouvelle règle

La dernière version du fichier htaccess inclut une règle supplémentaire:

RewriteRule ^index\.php$ - [L]  
Cela empêche / et /index.php pour un sous-répertoire d'être traité comme une même URL et cela accélère les scripts.

Explication du fonctionnement

Par défaut tous les accès sont redirigés sur index.php quand ce ne sont pas des fichiers réels. Mais index.php n'est pas vraiment une page, c'est un script qui recherche les articles dans la base de donnée.

Les URLs d'une page ou fichier qui se trouvent sur le site mais ne sont pas gérés par Wordpress, comme document.html ou archive.zip ou image.jpg, sont servis directement.

Lorsqu'on a choisi les URL dynamiques, de la forme https://www.scriptol.fr/index.php?p=n, le script recherche dans la base de donnée l'enregistrement correspondant à l'ID en paramètre et compose une page avec le template.

Il est recommandé d'opter pour des URL statiques faites de mots-clés avec de préférence un identificateur ajouté. Cela se fait dans les options à la section permaliens, avec quelque chose comme:

/%postname%-%post_id%  

Les URL significatives comme https://www.scriptol.fr/mon-article-12345 sont aussi redirigées sur index.php.
Mais la partie "mon-article-12345" est retrouvée dans la base de donnée qui enregistre les URL lors de la création du billet (et construites à partir du titre), puis le logiciel reprend le contenu correspondant pour composer une page.

La page 404

Elle est gérée aussi par le logiciel: si le script index.php ne trouve pas l'URL demandée, il charge une page spéciale, 404.php, qui se trouve jointe au thème.

Si l'on veut améliorer la gestion des erreurs d'URL par les internautes, il vaut mieux modifier le fichier 404.php plutôt que .htaccess.
Voir par exemple l'article: Une page 404 intelligente.

Liens externes