Comment réécrire les URL avec mod_rewrite pour Apache sur Debian 8

introduction

Dans ce didacticiel, nous allons activer et apprendre à gérer les réécritures d’URL à l’aide du module + mod_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 configure 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:

Étape 1 - Activer mod_rewrite

Premièrement, nous devons activer + mod_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 complètement activé. Dans l’étape suivante, nous allons configurer un fichier + .htaccess + que nous utiliserons pour définir les règles de réécriture des redirections.

É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 vos applications Web. La période qui précède le nom de fichier garantit que le fichier est masqué.

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. Vous devez donc tout d’abord autoriser les modifications du fichier. Ouvrez le fichier de configuration Apache par défaut en utilisant + nano + ou votre éditeur de texte favori.

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

Dans ce fichier, vous trouverez un bloc + <VirtualHost *: 80> + commençant à 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

<VirtualHost *:80>






   . . .
</VirtualHost>

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 maintenant d’un fichier + .htaccess + opérationnel que vous pouvez utiliser pour régir 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.

É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: /// 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

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

Vous pouvez accéder à cette page à + ​​http: /// about.html +, mais notez que si vous essayez d’accéder à + ​​http: /// about +, vous verrez une erreur * 404 Introuvable *. Si vous souhaitez que les utilisateurs accèdent à la page en utilisant simplement + about + à la place, les règles de réécriture autoriseront cette fonctionnalité même.

Tous les + RewriteRules + respectent le format suivant:

Structure générale de RewriteRule

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

  • + pattern + est une regular expression qui correspond à la chaîne souhaitée de l’URL, qui correspond à ce que le spectateur saisit dans le navigateur.

  • + substitution + est le chemin d’accès à l’URL réelle, c’est-à-dire le chemin du fichier serveurs Apache.

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

Ouvrez le fichier + .htaccess.

sudo nano /var/www/html/.htaccess

Après la première ligne, ajoutez le «+ RewriteRule +» marqué en rouge et enregistrez le fichier.

/var/www/html/.htaccess

RewriteEngine on

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

  • + ^ + indique le début de l’URL, après + / +.

  • + $ + indique la fin de l’URL.

  • + about + correspond à la chaîne "about".

  • + about.html + est le fichier auquel l’utilisateur accède.

  • + [NC] + est un drapeau qui rend la règle insensible à la casse.

Vous devriez maintenant pouvoir accéder à + ​​http: /// about + dans votre navigateur. En fait, avec la règle présentée ci-dessus, les URL suivantes pointeront sur + about.html:

  • + http: /// about +, à cause de la définition de la règle.

  • + http: /// About +, car la règle ne respecte pas la casse.

  • + http: /// about.html +, car le nom de fichier correct d’origine fonctionnera toujours.

Ce qui suit ne sera pas:

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

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

Vous avez maintenant un fichier + .htaccess + opérationnel avec une règle simple que vous pouvez modifier et étendre à vos besoins. Dans les sections suivantes, nous montrerons 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 query strings, qui sont ajoutées à une URL en utilisant un point d’interrogation (+? +) Après l’adresse. Les paramètres séparés sont délimités à l’aide d’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ésultat 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 transmis au script d’application imaginaire + result.php +: + item +, avec la valeur + shirt + et à + + saison + avec la valeur + summer + `. 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 des liens aussi longs et déplaisants que ceux décrits ci-dessus dans des URL faciles à taper et à interpréter visuellement. Dans cet exemple, nous aimerions simplifier le lien ci-dessus pour qu’il devienne + http: // example.com / shirt / summer +. Les valeurs du paramètre + 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 ^/$ results.php?item=&season= [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 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. Ainsi, si le visiteur saisit + http: //example.com/shirt/summer? +, Le serveur répondra par `+ results.php? Item = shirt & season = été + `. 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 pour aucun autre élément, comme + pantalon +, ni pour les saisons, comme + hiver +.

Pour rendre la règle plus générique, nous pouvons utiliser larges pour faire correspondre des parties de l’adresse d’origine et les utiliser dans un modèle de substitution. La règle modifiée se présentera alors comme suit:

Substitution simple

RewriteRule ^/ 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 sous la variable + $ 1 +. Le deuxième groupe de expression régulière entre parenthèses correspond exactement à + ​​summer,` + winter`, + fall ou` + spring`, et enregistre de manière similaire le fragment correspondant sous le nom + $ 2 +.

Les fragments correspondants sont ensuite utilisés dans l’URL résultante dans les variables + item + et + season + à la place des valeurs + shirt + et + summer + codées en dur précédemment utilisées.

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 évolutif, car il permet de réécrire correctement plusieurs articles 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 à nos règles de réécriture pour contrôler le moment où elles seront 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 motif ou la condition à rechercher.

  • + Flags + sont des paramètres facultatifs susceptibles de modifier la condition et les règles d’évaluation.

Si un + RewriteCond + a la valeur true, le + RewriteRule + qui suit immédiatement sera pris en compte. Si ce n’est pas le cas, la règle sera supprimée. Plusieurs + RewriteCond + peuvent être utilisés l’un après l’autre et, avec le comportement par défaut, ils doivent tous être évalués à true pour que la règle suivante soit considérée.

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 Introuvable *. 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és, +! - f + est évalué à true uniquement si un nom spécifié n’existe pas ou n’est pas un fichier.

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

Le + RewriteRule + sur la dernière ligne entrera en vigueur uniquement pour les demandes de fichiers ou de répertoires inexistants. Le + RewriteRule + lui-même est très simple et redirige chaque requête vers la racine du site + / +.

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 directive + RewriteRule + pour rediriger des URL, y compris celles contenant des chaînes de requête. Vous avez également appris à rediriger des URL de manière conditionnelle à l’aide de la directive + RewriteCond +.

Si vous souhaitez en savoir plus sur + mod_rewrite +, consultez Apache et mod_rewrite Introduction et http: //httpd.apache .org / docs / current / mod / mod_rewrite.html [Documentation officielle d’Apache pour mod_rewrite].