Créer son 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éécritureRewriteRulesuivante 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éécritureRewriteRulesuivante 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ètreGETpathau 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=....