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

introduction

Le module + mod_rewrite + d’Apache vous 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. 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 site par site ou par répertoire.

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

Conditions préalables

Pour suivre ce tutoriel, vous aurez besoin de:

Étape 1 - Activer mod_rewrite

Pour qu’Apache comprenne les règles de réécriture, nous devons 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 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 la prochaine étape, 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 votre application Web. La période qui précède le nom de fichier garantit que le fichier est masqué.

Avant de commencer à utiliser les fichiers + .htaccess +, vous devez 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 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 préféré:

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. Si vous avez utilisé + nano +, faites-le en pressant + CTRL + X +, + Y +, puis + ENTER +.

Ensuite, vérifiez votre configuration:

sudo apache2ctl configtest

S’il n’y a pas d’erreur, redémarrez Apache pour appliquer vos modifications:

sudo systemctl restart apache2

Maintenant, créez un fichier + .htaccess + à 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, nous allons créer un exemple de fichier 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 aux pages. Plus précisément, nous autoriserons les utilisateurs à accéder à + ​​http: /// about + et à afficher une page intitulé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 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 *. Pour accéder à la page en utilisant + / about + à la place, nous allons créer une règle de réécriture.

Tous les + RewriteRules + suivent ce format:

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 qu’Apache sert.

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

Créons notre règle de réécriture d’URL. Ouvrez le fichier + .htaccess:

sudo nano /var/www/html/.htaccess

Après la première ligne, ajoutez le + RewriteRule + suivant 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 pouvez maintenant accéder à + ​​http: /// about + dans votre navigateur. En fait, avec la règle ci-dessus, les URL suivantes pointeront également 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 du fichier d’origine fonctionnera toujours.

Toutefois, les éléments suivants ne fonctionneront pas:

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

  • + 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 de base 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ésagréables que l’exemple ci-dessus dans des URL simples, 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 ressemblera alors à ceci:

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 d’expressions rationnelles entre parenthèses correspond exactement à + ​​summer,` + winter`, + fall ou` + spring`, et enregistre 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 + au lieu 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 prochain + RewriteRule + sera considéré. Si ce n’est pas le cas, la règle sera supprimée. Plusieurs + RewriteConds + peuvent être utilisés l’un après l’autre, bien que tous doivent ê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 le nom spécifié n’existe pas ou n’est pas un fichier.

  • De même, +! - d + est évalué à true uniquement si le 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 + vous permet de créer 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].