Créer framework PHP : Réécriture d'URL (.htaccess)
Déclarons des règles de réécriture d'URL dans un fichier .htaccess pour router avec des URLs user-friendly.
Pourquoi réécrire les URLs ?
L’URL rewriting est le processus de modification et de réécriture des URLs des pages web pour des raisons esthétiques, de lisibilité et d’optimisation. Il est généralement mis en place en écrivant des règles à destination de notre serveur web.
Au sein de notre micro framework PHP, l’objectif est de faire disparaître le paramètre GET
path
de l’URL.
Autrement dit, de faire correspondre une URL à la forme plugo.local/index.php?path=/formations/php
en plugo.local/formations/php
.
Plus sympa non ?! 🤩
Le fichier .htaccess
Notre dossier 📁 public
constituant la racine de notre serveur web, c’est à l’intérieur que nous créerons un fichier 📄 .htaccess
, dédié à la configuration de notre serveur Apache, et par extension, à la définition de nos règles de réécriture d’URL.
Écriture des règles
Ajouter les règles suivantes :
Options -Indexes -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ index.php?path=$1 [QSA,L]
Options -Indexes -MultiViews
: Désactive l’affichage du contenu des répertoires lors son accès via l’URL et empêche la négociation de contenu (fournissant automatiquement la meilleure correspondance possible pour une ressource demandée).RewriteEngine On
: Active le module de réécriture d’URL d’Apache.RewriteCond %{REQUEST_FILENAME} !-d
: La règle de réécritureRewriteRule
suivante s’appliquera seulement si la requête ne demande pas d’accèder à un répertoire.RewriteCond %{REQUEST_FILENAME} !-f
: La règle de réécritureRewriteRule
suivante s’appliquera seulement si la requête ne demande pas d’accèder à un fichier. Cela permet entre autres de ne pas réécrire les chemins vers les ressources (CSS, JS…).RewriteRule ^(.+)$ index.php?path=$1 [QSA,L]
: Réécrit l’URL de la requête en passant le chemin demandé comme valeur du paramètreGET
path
au contrôleur frontal📄 index.php
.QSA
(pour « Query String Append ») signifie que l’on souhaite garder les autres paramètres de requête éventuels (autres quepath
) etL
(pour « Last »), indique que si cette règle est appliquée, les règles suivantes éventuelles ne seront pas exécutées.
Ainsi, l’URL plugo.local/formations/php
restera inchangée dans la barre d’adresse du navigateur, mais sera traitée comme plugo.local/index.php?path=/formations/php
par le serveur web.
Dans le cas où vous n'avez pas créé de virtual host
Si vous n’avez pas créé de virtual host pointant vers le dossier 📁 public
de votre projet, alors vos URLs doivent contenir /public
. Exemple : localhost/nom-projet/public/formations/php.
Afin d’éviter cela, vous avez toujours la possibilité de déplacer votre fichier 📄 .htaccess
à la racine de votre projet (dans le dossier parent de 📁 public
), puis de spécifier via la règle de réécriture d’aller dans 📁 public
pour chercher 📄 index.php
.
# ...
RewriteRule ^(.+)$ public/index.php?path=$1 [QSA,L]
Si vous mettez en place l’URL rewriting au sein de votre micro framework PHP, pensez à modifier la méthode redirectToRoute()
de la manière suivante :
protected function redirectToRoute(string $path, array $params = []): void {
$uri = '/' . $path;
if (!empty($params)) {
$strParams = [];
foreach ($params as $key => $val) {
array_push($strParams, urlencode((string) $key) . '=' . urlencode((string) $val));
}
$uri .= '&' . implode('&', $strParams);
}
header("Location: " . $uri);
die;
}
Votre fichier 📄 .htaccess
réécrira automatiquement votre url sous la forme ?path=...
.