Comment réécrire des URL avec mod rewrite pour Apache sur Ubuntu 22.04

De Get Docs
Aller à :navigation, rechercher

L'auteur a sélectionné le Diversity in Tech Fund pour recevoir un don dans le cadre du programme Write for DOnations.

Introduction

Le module mod_rewrite d'Apache vous permet de réécrire les URL plus proprement, en traduisant les chemins lisibles par l'homme en chaînes de requête conviviales pour le code. Il vous permet également de réécrire des URL en fonction de conditions.

Un fichier .htaccess vous permet de créer et d'appliquer des règles de réécriture sans accéder aux fichiers de configuration du serveur. En plaçant le fichier .htaccess à la racine de votre site Web, vous pouvez gérer les réécritures par site ou par répertoire.

Dans ce didacticiel, vous allez activer mod_rewrite et utiliser des fichiers .htaccess pour créer une redirection d'URL de base, puis explorer quelques cas d'utilisation avancés.

Conditions préalables

Pour suivre ce tutoriel, vous aurez besoin de :

Étape 1 - Activation de mod_rewrite

Pour qu'Apache comprenne les règles de réécriture, vous devez d'abord activer mod_rewrite. Il est déjà installé, mais il est désactivé sur une installation Apache par défaut. Utilisez la commande a2enmod pour activer le module :

sudo a2enmod rewrite

Cela activera le module ou vous avertira que le module est déjà activé. Pour appliquer ces modifications, redémarrez Apache.

sudo systemctl restart apache2

mod_rewrite est maintenant entièrement activé. Dans l'étape suivante, vous configurerez un fichier .htaccess que vous utiliserez pour définir des règles de réécriture pour les redirections.

Étape 2 - Configuration de .htaccess

Un fichier .htaccess nous permet de modifier vos règles de réécriture sans accéder aux fichiers de configuration du serveur. Pour cette raison, .htaccess est essentiel à la sécurité de votre application Web. Le point qui précède le nom du fichier garantit que le fichier est masqué.

Remarque : Toutes les règles que vous pouvez placer dans un fichier .htaccess peuvent également être placées directement dans les fichiers de configuration du serveur. En fait, la documentation officielle d'Apache recommande d'utiliser les fichiers de configuration du serveur au lieu de .htaccess car Apache les traite plus rapidement de cette façon.

Cependant, dans cet exemple simple, l'augmentation des performances sera négligeable. De plus, la définition de règles dans .htaccess est pratique, en particulier avec plusieurs sites Web sur le même serveur. Il ne nécessite pas de redémarrage du serveur pour que les modifications prennent effet et il ne nécessite pas de privilèges root pour modifier ces règles, ce qui simplifie la maintenance et rend les modifications possibles avec un compte non privilégié. Certains logiciels open source populaires, comme WordPress et Joomla, s'appuient souvent sur un fichier .htaccess pour que le logiciel modifie et crée des règles supplémentaires à la demande.


Avant de commencer à utiliser les fichiers .htaccess, vous devrez configurer et sécuriser quelques paramètres supplémentaires.

Par défaut, Apache interdit l'utilisation d'un fichier .htaccess pour appliquer des règles de réécriture, vous devez donc d'abord autoriser les modifications apportées au fichier. Ouvrez le fichier de configuration Apache par défaut à l'aide de nano ou de votre éditeur de texte préféré.

sudo nano /etc/apache2/sites-available/000-default.conf

Dans ce fichier, vous trouverez un bloc <VirtualHost *:80> commençant sur la première ligne. À l'intérieur de ce bloc, ajoutez le nouveau bloc suivant pour que votre fichier de configuration ressemble à ce qui suit. Assurez-vous que tous les blocs sont correctement indentés.

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
    <Directory /var/www/html>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
    
    . . .
</VirtualHost>

Enregistrez et fermez le fichier. Pour appliquer ces modifications, redémarrez Apache.

sudo systemctl restart apache2

Maintenant, créez un fichier .htaccess dans la racine Web.

sudo nano /var/www/html/.htaccess

Ajoutez cette ligne en haut du nouveau fichier pour activer le moteur de réécriture.

/var/www/html/.htaccess

RewriteEngine on

Enregistrez le fichier et quittez.

Vous disposez maintenant d'un fichier .htaccess opérationnel que vous pouvez utiliser pour régir les règles de routage de votre application Web. À l'étape suivante, vous créerez des exemples de fichiers de site Web que vous utiliserez pour illustrer les règles de réécriture.

Étape 3 - Configuration des réécritures d'URL

Ici, vous allez configurer une réécriture d'URL de base qui convertit les jolies URL en véritables chemins d'accès aux pages. Plus précisément, vous autoriserez les utilisateurs à accéder à http://your_server_ip/about, mais afficherez une page appelée about.html.

Commencez par créer un fichier nommé about.html dans la racine Web.

sudo nano /var/www/html/about.html

Copiez le code HTML suivant dans le fichier, puis enregistrez-le et fermez-le.

/var/www/html/about.html

<html>
    <head>
        <title>About Us</title>
    </head>
    <body>
        <h1>About Us</h1>
    </body>
</html>

Vous pouvez accéder à cette page sur http://your_server_ip/about.html, mais notez que si vous essayez d'accéder à http://your_server_ip/about, vous verrez une erreur 404 Not Found. Pour accéder à la page en utilisant /about à la place, vous allez créer une règle de réécriture.

Tous les RewriteRules suivent ce format :

Structure générale de la règle de réécriture

RewriteRule pattern substitution [flags]
  • RewriteRule spécifie la directive.
  • pattern est une expression régulière qui correspond à la chaîne souhaitée à partir de l'URL, qui correspond à ce que l'utilisateur saisit dans le navigateur.
  • substitution est le chemin vers l'URL réelle, c'est-à-dire le chemin du fichier des serveurs Apache.
  • flags sont des paramètres facultatifs qui peuvent modifier le fonctionnement de la règle.

Ensuite, créez votre règle de réécriture d'URL. Ouvrez le fichier .htaccess.

sudo nano /var/www/html/.htaccess

Après la première ligne, ajoutez RewriteRule en surbrillance et enregistrez le fichier.

/var/www/html/.htaccess

RewriteEngine on
RewriteRule ^about$ about.html [NC]

Dans ce cas, ^about$ est le motif, about.html est la substitution et [NC] est un drapeau. Cet exemple utilise quelques caractères ayant une signification particulière :

  • ^ indique le début de l'URL après your_server_ip/.
  • $ indique la fin de l'URL.
  • about correspond à la chaîne « about ».
  • about.html est le fichier réel auquel l'utilisateur accède.
  • [NC] est un indicateur qui rend la règle insensible à la casse.

Vous pouvez maintenant accéder à http://your_server_ip/about dans votre navigateur. En fait, avec la règle indiquée ci-dessus, les URL suivantes pointeront vers about.html :

Cependant, ce qui suit ne fonctionnera pas :

Vous disposez maintenant d'un fichier .htaccess opérationnel avec une règle de base que vous pouvez modifier et étendre selon vos besoins. Dans les sections suivantes, vous passerez en revue deux exemples supplémentaires de directives couramment utilisées.

Exemple 1 — Simplification des chaînes de requête avec RewriteRule

Les applications Web utilisent souvent des chaînes de requête, qui sont ajoutées à une URL à l'aide d'un point d'interrogation (?) après l'adresse. Les paramètres séparés sont délimités par une esperluette (&). Des chaînes de requête peuvent être utilisées pour transmettre des données supplémentaires entre des pages d'application individuelles.

Par exemple, une page de résultats de recherche écrite en PHP peut utiliser une URL telle que http://example.com/results.php?item=shirt&season=summer. Dans cet exemple, deux paramètres supplémentaires sont passés au script d'application imaginaire result.php : item, avec la valeur shirt, et season avec la valeur [X168X ]. L'application peut utiliser les informations de la chaîne de requête pour créer la bonne page pour le visiteur.

Les règles de réécriture d'Apache sont souvent utilisées pour simplifier des liens aussi longs et désagréables que ceux ci-dessus en URL conviviales qui sont plus faciles à taper et à interpréter visuellement. Dans cet exemple, vous allez simplifier le lien ci-dessus pour devenir http://example.com/shirt/summer. Les valeurs des paramètres shirt et summer sont toujours dans l'adresse mais sans la chaîne de requête et le nom du script.

Voici une règle pour implémenter ceci :

Substitution simple

RewriteRule ^shirt/summer$ results.php?item=shirt&season=summer [QSA]

Le shirt/summer est explicitement mis en correspondance dans l'adresse demandée et Apache est invité à servir results.php?item=shirt&season=summer à la place.

Les drapeaux [QSA] sont couramment utilisés dans les règles de réécriture. Ils disent à Apache d'ajouter toute chaîne de requête supplémentaire à l'URL servie, donc si le visiteur tape http://example.com/shirt/summer?page=2, le serveur répondra avec results.php?item=shirt&season=summer&page=2. Sans cela, la chaîne de requête supplémentaire serait supprimée.

Bien que cette méthode permette d'obtenir l'effet souhaité, le nom de l'élément et la saison sont codés en dur dans la règle. Cela signifie que la règle ne fonctionnera pas pour d'autres éléments, comme pants, ou des saisons, comme winter.

Pour rendre la règle plus générique, vous pouvez utiliser des expressions régulières pour faire correspondre des parties de l'adresse d'origine et utiliser ces parties dans un modèle de substitution. La règle modifiée ressemblera alors à ceci :

Substitution simple

RewriteRule ^([A-Za-z0-9]+)/(summer|winter|fall|spring) results.php?item=$1&season=$2 [QSA]

Le premier groupe d'expressions régulières entre parenthèses correspond à une chaîne contenant des caractères alphanumériques et des nombres tels que shirt ou pants et enregistre le fragment correspondant en tant que variable $1. Le deuxième groupe d'expressions régulières entre parenthèses correspond exactement à summer, winter, fall ou spring, et enregistre de la même manière le fragment correspondant sous [X162X ].

Les fragments correspondants sont ensuite utilisés dans l'URL résultante dans les variables item et season au lieu des valeurs codées en dur shirt et summer que vous utilisiez auparavant.

Ce qui précède convertira, par exemple, http://example.com/pants/summer en http://example.com/results.php?item=pants&season=summer. Cet exemple est également à l'épreuve du temps, permettant de réécrire correctement plusieurs éléments et saisons à l'aide d'une seule règle.

Exemple 2 - Ajout de conditions avec une logique à l'aide de RewriteConds

Les règles de réécriture ne sont pas nécessairement toujours évaluées une par une sans aucune limitation. La directive RewriteCond nous permet d'ajouter des conditions à vos règles de réécriture pour contrôler le moment où les règles sont traitées. Tous les RewriteConds respectent le format suivant :

Structure générale de RewriteCond

RewriteCond TestString Condition [Flags]
  • RewriteCond spécifie la directive RewriteCond.
  • TestString est la chaîne à tester.
  • Condition est le modèle ou la condition à faire correspondre.
  • Flags sont des paramètres optionnels qui peuvent modifier la condition et les règles d'évaluation.

Si un RewriteCond est évalué comme vrai, le RewriteRule suivant immédiatement sera pris en compte. Si ce n'est pas le cas, la règle sera ignorée. Plusieurs RewriteCond peuvent être utilisés les uns après les autres et, avec le comportement par défaut, tous doivent être évalués comme vrais pour que la règle suivante soit prise en compte.

Par exemple, supposons que vous souhaitiez rediriger toutes les requêtes vers des fichiers ou des répertoires inexistants sur votre site vers la page d'accueil au lieu d'afficher la page d'erreur standard 404 Not Found. Ceci peut être réalisé avec les règles de conditions suivantes :

Rediriger toutes les demandes vers des fichiers et répertoires inexistants vers la page d'accueil

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . / [R=301]

Avec ce qui précède :

  • %{REQUEST_FILENAME} est la chaîne à vérifier. Dans ce cas, il s'agit du nom de fichier demandé, qui est une variable système disponible pour chaque requête.
  • -f est une condition intégrée qui vérifie si le nom demandé existe sur le disque et est un fichier. Le ! est un opérateur de négation. Combiné, !-f est évalué à true uniquement si un nom spécifié n'existe pas ou n'est pas un fichier.
  • De même, !-d prend la valeur true uniquement si un nom spécifié n'existe pas ou n'est pas un répertoire.

Le RewriteRule sur la dernière ligne n'entrera en vigueur que pour les requêtes vers des fichiers ou des répertoires inexistants. Le RewriteRule lui-même est très simple. Le point . dans le modèle correspond à n'importe quoi et la substitution dirige chaque demande vers la racine du site Web /.

De plus, l'indicateur [R=301] indique à Apache de renvoyer un code de réponse HTTP de redirection 301 Moved Permanently au navigateur, ce qui fait qu'un navigateur sait que la redirection s'est produite et récupère explicitement la racine du site Web au lieu de l'URL demandée. , la modification étant reflétée dans la barre d'adresse du navigateur.

Sans cet indicateur, Apache renverrait le contenu de la racine du site Web, mais le navigateur penserait toujours que l'URL de la page demandée existe et afficherait l'adresse initialement demandée dans la barre d'adresse.

Conclusion

mod_rewrite vous permet de créer des URL lisibles par l'homme. Dans ce tutoriel, vous avez utilisé la directive RewriteRule pour rediriger les URL, y compris celles avec des chaînes de requête. Vous avez également écrit des URL de redirection conditionnelle à l'aide de la directive RewriteCond.

Si vous souhaitez en savoir plus sur mod_rewrite, jetez un œil à Apache's mod_rewrite Introduction et Apache's official documentation for mod_rewrite.