Comment réécrire des URL avec mod_rewrite pour Apache sur Ubuntu 16.04

introduction

Dans ce didacticiel, nous allons activer et apprendre à gérer les réécritures d'URL à l'aide du modulemod_rewrite d'Apache 2. Ce module nous permet de réécrire les URL de manière plus propre, en convertissant les chemins lisibles par l’homme en chaînes de requête conviviales pour le code ou en redirigeant les URL en fonction de conditions supplémentaires.

Ce guide est divisé en deux parties. Le premier met en place un exemple de site Web et couvre un exemple simple de réécriture. La deuxième partie contient deux exemples plus détaillés de règles de réécriture couramment utilisées.

Conditions préalables

Pour suivre ce tutoriel, vous aurez besoin de:

[[step-1 -—- enabled-mod_rewrite]] == Étape 1 - Activation de mod_rewrite

Tout d'abord, nous devons activermod_rewrite. Il est disponible mais non activé avec une nouvelle installation d’Apache 2.

sudo a2enmod rewrite

Cela activera le module ou vous alertera 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é. À l'étape suivante, nous allons configurer un fichier.htaccess que nous utiliserons pour définir des règles de réécriture pour les redirections.

[[step-2 -—- setting-up-htaccess]] == Étape 2 - Configuration de .htaccess

Un fichier.htaccess nous permet de modifier nos 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. La période qui précède le nom de fichier garantit que le fichier est masqué.

[.Remarque]##

Note: Toutes les règles que vous pouvez mettre dans un fichier.htaccess peuvent également être placées directement dans les fichiers de configuration du serveur. En fait, leofficial Apache documentation recommande d'utiliser les fichiers de configuration du serveur au lieu de.htaccess car Apache le 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 en.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, simplifiant la maintenance et rendant les modifications possibles avec un compte non privilégié. Certains logiciels open source populaires, comme Wordpress et Joomla, reposent souvent sur un fichier.htaccess pour que le logiciel modifie et crée des règles supplémentaires à la demande.

Nous devrons configurer et sécuriser quelques paramètres supplémentaires avant de pouvoir commencer.

Par défaut, Apache interdit l'utilisation d'un fichier.htaccess pour appliquer des règles de réécriture, donc vous devez d'abord autoriser les modifications du fichier. Ouvrez le fichier de configuration Apache par défaut en utilisantnano ou 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 afin que votre fichier de configuration ressemble à celui-ci. Assurez-vous que tous les blocs sont correctement mis en retrait.

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


    
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
    

    . . .

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

sudo systemctl restart apache2

Maintenant, créez le 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 désormais d'un fichier.htaccess opérationnel que vous pouvez utiliser pour gérer les règles de routage de votre application Web. Dans la prochaine étape, nous allons créer des exemples de fichiers de site Web que nous utiliserons pour illustrer les règles de réécriture.

[[step-3 -—- configuring-url-rewrites]] == Étape 3 - Configuration des réécritures d'URL

Ici, nous allons configurer une réécriture d'URL de base, qui convertit les jolies URL en chemins d'accès réels au code. Plus précisément, nous autoriserons les utilisateurs à accéder àhttp://your_server_ip/about.

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 et fermez-le.

/var/www/html/about.html


    
        About Us
    
    
        

About Us

Vous pouvez accéder à cette page àhttp://your_server_ip/about.html, mais notez que si vous essayez d'accéder àhttp://your_server_ip/about, vous verrez une erreur404 Not Found. Si vous voulez que les utilisateurs accèdent à la page en utilisant simplementabout à la place, les règles de réécriture autoriseront cette fonctionnalité même.

Tous lesRewriteRules respectent le format suivant:

Structure générale de RewriteRule

RewriteRule pattern substitution [flags]
  • RewriteRule spécifie la directive.

  • pattern est unregular expression qui correspond à la chaîne souhaitée à partir de l'URL, ce que le spectateur tape dans le navigateur.

  • substitution est le chemin vers l'URL réelle, c'est-à-dire le chemin du fichier serveurs Apache.

  • flags sont des paramètres facultatifs qui peuvent modifier le fonctionnement de la règle.

Ouvrez le fichier.htaccess.

sudo nano /var/www/html/.htaccess

Après la première ligne, ajoutez lesRewriteRule marqués en rouge et enregistrez le fichier.

/var/www/html/.htaccess

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

Dans ce cas,^about$ est le modèle,about.html est la substitution et[NC] est un indicateur. Notre exemple utilise quelques caractères avec une signification particulière:

  • ^ indique le début de l'URL, aprèsyour_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 devriez maintenant pouvoir accéder àhttp://your_server_ip/about dans votre navigateur. En fait, avec la règle ci-dessus, les URL suivantes pointeront versabout.html:

  • http://your_server_ip/about, en raison de la définition de la règle.

  • http://your_server_ip/About, car la règle est insensible à la casse.

  • http://your_server_ip/about.html, car le nom de fichier d'origine fonctionnera toujours.

Ce qui suit ne sera pas:

  • http://your_server_ip/about/, car la règle indique explicitement qu'il ne peut rien y avoir aprèsabout en utilisant le caractère$.

  • http://your_server_ip/contact, car il ne correspondra pas à la chaîneabout de la règle.

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

[[example-1 -—- simplifying-query-strings-with-rewriterule]] == Exemple 1 - Simplification des chaînes de requête avec RewriteRule

Les applications Web utilisent souventquery strings, qui sont ajoutés à 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 (&). Les chaînes de requête peuvent être utilisées pour transmettre des données supplémentaires entre différentes pages d'application.

Par exemple, une page de résultats de recherche écrite en PHP peut utiliser une URL telle quehttp://example.com/results.php?item=shirt&season=summer. Dans cet exemple, deux paramètres supplémentaires sont transmis au script d'application imaginaireresult.php:item, avec la valeurshirt, etseason avec la valeursummer. 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 Apache sont souvent utilisées pour simplifier les liens longs et déplaisants comme ci-dessus enfriendly URLs plus faciles à saisir et à interpréter visuellement. Dans cet exemple, nous aimerions simplifier le lien ci-dessus pour devenirhttp://example.com/shirt/summer. Les valeurs des paramètresshirt etsummer 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]

Leshirt/summer correspond explicitement à l'adresse demandée et Apache est invité à servirresults.php?item=shirt&season=summer à la place.

Les indicateurs[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 tapehttp://example.com/shirt/summer?page=2, le serveur répondra avecresults.php?item=shirt&season=summer&page=2. Sans cette valeur, la chaîne de requête supplémentaire serait ignorée.

Bien que cette méthode produise 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 les autres éléments, commepants, ou les saisons, commewinter.

Pour rendre la règle plus générique, nous pouvons utiliserregular expressions 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 se présentera alors comme suit:

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 queshirt oupants 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 ouspring, et enregistre de la même manière le fragment correspondant en tant que$2.

Les fragments correspondants sont ensuite utilisés dans l'URL résultante dans les variablesitem etseason au lieu des valeursshirt etsummer codées en dur que nous utilisions auparavant.

Ce qui précède convertira, par exemple,http://example.com/pants/summer enhttp://example.com/results.php?item=pants&season=summer. Cet exemple est également évolutif, car il permet de réécrire correctement plusieurs articles et saisons à l’aide d’une seule règle.

[[example-2 -—- addition-de-conditions-avec-logique-en-utilisant-rewriteconds]] == Exemple 2 - Ajout de conditions avec logique en utilisant RewriteConds

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

Structure générale de RewriteCond

RewriteCond TestString Condition [Flags]
  • RewriteCond spécifie la directiveRewriteCond.

  • TestString est la chaîne à tester.

  • Condition est le modèle ou la condition à faire correspondre.

  • Flags sont des paramètres facultatifs qui peuvent modifier la condition et les règles d'évaluation.

Si unRewriteCond est évalué à vrai, lesRewriteRule immédiatement suivants seront pris en compte. Si ce n'est pas le cas, la règle sera supprimée. PlusieursRewriteCond peuvent être utilisés l'un après l'autre et, avec le comportement par défaut, tous doivent être évalués à vrai pour que la règle suivante soit prise en compte.

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

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

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /

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 demande.

  • -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é à vrai uniquement si un nom spécifié n'existe pas ou n'est pas un fichier.

  • De même,!-d est évalué à vrai uniquement si un nom spécifié n'existe pas ou n'est pas un répertoire.

LesRewriteRule sur la dernière ligne n'entreront en vigueur que pour les requêtes adressées à des fichiers ou répertoires inexistants. LeRewriteRule lui-même est très simple et redirige chaque requête vers la racine du site Web de/.

Conclusion

mod_rewrite est un module Apache utile qui peut être utilisé efficacement pour garantir des URL lisibles par l'homme. Dans ce didacticiel, vous avez appris à utiliser la directiveRewriteRule pour rediriger les URL, y compris celles contenant des chaînes de requête. Vous avez également appris à rediriger les URL de manière conditionnelle à l'aide de la directiveRewriteCond.

Si vous souhaitez en savoir plus surmod_rewrite, jetez un œil àApache’s mod_rewrite Introduction etApache’s official documentation for mod_rewrite.