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.

Icône de calendrier
Avancé
10 chapitres

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 :

.htaccess
copié !
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éécriture RewriteRule 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éécriture RewriteRule 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ètre GET 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 que path) et L (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.

.htaccess
copié !
# ...
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 :

AbstractController.php
copié !
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=....