Comment configurer mod_rewrite pour Apache sur CentOS 7

introduction

Apache est un serveur Web modulaire qui vous permet de personnaliser ses fonctionnalités en activant et en désactivant des modules. Les administrateurs ont ainsi la possibilité d’adapter les fonctionnalités d’Apache aux besoins de leur application Web.

Dans ce didacticiel, nous allons installer Apache sur un serveur CentOS 7, confirmer que le module + mod_rewrite + est activé et explorer certaines fonctions essentielles.

Prérequis

Avant de suivre ce didacticiel, assurez-vous que vous avez un utilisateur régulier, non root, avec des privilèges sudo. Pour en savoir plus sur la configuration d’un utilisateur avec ces privilèges, consultez notre guide, https://www.digitalocean.com/community/tutorials/how-to-create-a-sudo-user-on-centos-quickstart [ Comment créer un utilisateur Sudo sur CentOS].

Étape 1 - Installer Apache

Nous installerons Apache en utilisant + yum +, l’utilitaire de gestion de paquets par défaut pour CentOS.

sudo yum install httpd

Lorsque vous y êtes invité avec le message + Est-ce correct [y / d / N]: +, tapez + Y + et appuyez sur la touche + ENTER + pour autoriser l’installation.

Ensuite, démarrez le démon Apache, un processus autonome qui crée un pool de processus enfants ou de threads pour gérer les demandes, à l’aide de l’utilitaire + systemctl +:

sudo systemctl start httpd

Pour vous assurer qu’Apache a bien démarré, vérifiez son état à l’aide de la commande + status +:

sudo systemctl status httpd
Output. . .
systemd[1]: Starting The Apache HTTP Server...
systemd[1]:

Apache étant opérationnel, tournons notre attention vers ses modules.

Étape 2 - Vérification de mod_rewrite

À partir de la version 7 de CentOS, le module Apache + mod_rewrite + est activé par défaut. Nous vérifierons que c’est le cas avec la commande + httpd + et l’indicateur + -M +, qui affiche une liste de tous les modules chargés:

httpd -M
Output . . .
remoteip_module (shared)
reqtimeout_module (shared)

setenvif_module (shared)
slotmem_plain_module (shared)
. . .

Si le + rewrite_module + n’apparaît pas dans la sortie, activez-le en modifiant le fichier + 00-base.conf + avec l’éditeur + vi +:

sudo vi /etc/httpd/conf.modules.d/00-base.conf

Une fois le fichier texte ouvert, tapez + i + pour passer en mode insertion, puis ajoutez ou décommentez la ligne en surbrillance ci-dessous:

/etc/httpd/conf.modules.d/00-base.conf

#
# This file loads most of the modules included with the Apache HTTP
# Server itself.
#
. . .

. . .

Maintenant, appuyez sur + ESC + pour quitter le mode insertion. Ensuite, tapez +: x + puis appuyez sur la touche + ENTER + pour enregistrer et quitter le fichier.

Ensuite, appliquez le changement de configuration en redémarrant Apache:

sudo systemctl restart httpd

Apache étant installé et le module + mod_rewrite + activé, nous sommes prêts à configurer l’utilisation d’un fichier + .htaccess +.

Étape 3 - Configurer un fichier .htaccess

Un fichier + .htaccess + permet de définir des directives pour Apache, y compris un + RewriteRule +, sur une base par domaine sans modifier les fichiers de configuration du serveur. Sous Linux, les fichiers précédés d’un point (+. +) Sont traités comme cachés.

Avant d’utiliser un fichier + .htaccess +, nous devons mettre à jour le paramètre + AllowOverride + pour pouvoir écraser les directives Apache.

sudo vi /etc/httpd/conf/httpd.conf

Localisez la section + <Directory / var / www / html> + et modifiez la directive + AllowOverride + de + None + en + + + +:

/etc/httpd/conf/httpd.conf

. . .
<Directory /var/www/html>
. . .
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# Options FileInfo AuthConfig Limit
#

. . .
</Directory>
. . .

Enregistrez et quittez le fichier, puis redémarrez Apache pour appliquer la modification:

sudo systemctl restart httpd

Ensuite, créez un fichier + .htaccess dans la racine du document par défaut,` + / var / www / html`, pour Apache.

sudo vi /var/www/html/.htaccess

Ajoutez la ligne suivante en haut du fichier pour activer le + RewriteEngine +, qui indique à Apache de traiter les règles suivantes:

/var/www/html/.htaccess

RewriteEngine On

Enregistrez et quittez le fichier.

Vous avez maintenant un fichier + .htaccess + qui vous permettra de définir des règles pour manipuler les URL selon vos besoins. Avant de commencer à écrire les règles réelles, prenons un moment pour revoir la syntaxe de base + mod_rewrite +.

Étape 4 - Explorer la syntaxe RewriteRule

La directive + RewriteRule + nous permet de remapper une demande à Apache à partir de l’URL. Un fichier + .htaccess + peut contenir plus d’une règle de réécriture, mais au moment de l’exécution, Apache applique les règles dans leur ordre défini. Une règle de réécriture comprend la structure suivante:

+ RewriteRule Pattern Substitution [Drapeaux] +

  • RewriteRule: spécifie la directive + RewriteRule +

  • Pattern: une expression PCRE (Perl Compatible Regular Expression) qui correspond à la chaîne souhaitée. Vous pouvez en savoir plus sur les expressions régulières here.

  • Substitution: où doivent être envoyées les requêtes correspondantes

  • [Flags]: paramètres facultatifs pour modifier la règle. Pour plus d’informations sur les indicateurs disponibles et leur signification, reportez-vous à la documentation d’Apache à l’adresse Rewrite Flags.

Le + RewriteRule + est le fer de lance des directives + mod_rewrite +, c’est pourquoi nous nous y intéressons principalement dans ce tutoriel.

Étape 5 - Explorer la syntaxe RewriteCond

La directive + RewriteCond + nous permet d’ajouter des conditions à une règle de réécriture. Une condition de réécriture comprend la structure suivante:

+ RewriteCond TestString Condition [Drapeaux] +

  • RewriteCond: spécifie la directive + RewriteCond +

  • TestString: une chaîne à tester

  • Condition: un motif à faire correspondre

  • [Flags]: paramètre facultatif permettant de modifier la condition.

La directive + RewriteCond + ne permet pas à Apache de prendre en compte les règles de réécriture qui le suivent, sauf si la condition particulière est évaluée à true.

Étape 6 - Configuration des fichiers

Nous allons configurer une règle de réécriture de base pour permettre aux utilisateurs de visiter une page + about.html + sans saisir l’extension de fichier (+ .html +) dans la barre d’adresse d’un navigateur Web. Commencez par créer un fichier + about.html dans le répertoire racine du document:

sudo vi /var/www/html/about.html

Copiez le code HTML suivant dans le fichier:

/var/www/html/about.html

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

Enregistrez et quittez le fichier.

Dans un navigateur Web, accédez à l’adresse suivante:

http:///about.html

Vous devriez voir une page blanche avec * About Us * dessus. Si vous supprimez le * .html * de la barre d’adresses et rechargez la page, vous recevrez une erreur 404 * Not Found *. Apache ne peut accéder aux composants que par leur nom de fichier complet, mais nous pouvons le modifier avec une règle de réécriture.

Étape 7 - Configurer une RewriteRule

Nous aimerions que les visiteurs de la page * About Us * y aient accès sans devoir taper + .html +. Pour ce faire, nous allons créer une règle.

Ouvrez le fichier + .htaccess:

sudo vi /var/www/html/.htaccess

Après la ligne + RewriteEngine On +, ajoutez ce qui suit:

/var/www/html/.htaccess

RewriteRule ^about$ about.html [NC]

Enregistrez et quittez le fichier.

Les visiteurs peuvent maintenant accéder à la page * À propos * avec l’URL + http: /// about +.

Examinons la règle de réécriture:

+ ^ about $ + sert de modèle correspondant à l’URL et à ce que l’utilisateur tape dans son navigateur. + Notre exemple utilise un couple metacharacters pour s’assurer que le terme n’existe que dans un emplacement particulier de l’URL:

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

  • + & + signifie la fin de l’URL

+ about.html + indique le chemin d’accès au fichier qu’Apache sert lorsqu’il rencontre un modèle correspondant.

+ [NC] + est un drapeau qui indique à la règle de réécriture de ne pas tenir compte de la casse pour permettre à l’utilisateur de saisir des lettres minuscules et majuscules dans l’URL. Par exemple, les URL suivantes pointent vers le fichier + about.html +:

  • /sur

  • /À propos

  • /SUR

Avec une simple règle de réécriture, nous avons ajouté un aspect dynamique à la manière dont les utilisateurs peuvent accéder à la page * À propos de nous *.

Patterns communs

Maintenant que nous avons une compréhension de base des règles de réécriture, nous allons explorer deux exemples supplémentaires dans cette section.

Des exemples de fichiers peuvent être configurés, mais ce tutoriel n’inclut pas leur création. juste la réécriture règle elle-même.

Exemple 1: simplification des chaînes de requête avec un RewriteRule

Les applications Web utilisent souvent des chaînes de requête, qui sont ajoutées à une URL à l’aide du caractère de point d’interrogation (+? +) Et délimité par le caractère esperluette (+ & +). Apache ignore ces deux caractères lors de la correspondance des règles de réécriture. Cependant, des chaînes de requête peuvent parfois être nécessaires pour la transmission de données entre pages. Par exemple, l’URL d’une page de résultat de recherche écrite en PHP peut ressembler à ceci:

http://example.com/results.php?item=shoes&type=women

Au lieu de cela, nous aimerions que nos visiteurs puissent utiliser l’URL de nettoyage suivante:

http://example.com/shoes/women

Nous pouvons obtenir ces résultats de deux manières: par un simple remplacement ou par des options correspondantes.

  • Exemple 1A: Remplacement simple *

Nous allons créer une règle de réécriture qui effectue un remplacement simple, simplifiant ainsi une URL de requête longue:

/var/www/html/.htaccess

RewriteRule ^shoes/women$ results.php?item=shoes&type=women

La règle associe + chaussures / femmes à` + résultats.php? Article = type de chaussures = femmes`.

  • Exemple 1B: Options de correspondance *

Dans certains cas, nous pouvons vouloir généraliser la chaîne de requête pour inclure différents types de chaussures. Nous pouvons accomplir cela en procédant comme suit:

  • Spécifiez une série d’options en utilisant le tube vertical + | +, l’opérateur booléen «OU»

  • Regroupez la correspondance en utilisant + () +, puis référencez le groupe en utilisant la variable + $ 1 +, avec + 1 + pour le premier groupe correspondant

La règle de réécriture devient maintenant:

/var/www/html/.htaccess

RewriteRule ^shoes/(men|women|youth) results.php?item=shoes&type=$1

La règle ci-dessus correspond à une URL de + chaussures / + suivie d’un type spécifié. Cela modifiera l’URL d’origine pour que:

http://example.com/shoes/men

devient:

http://example.com/results.php?item=shoes&type=men

Cette option de correspondance permet à Apache d’évaluer plusieurs modèles sans avoir à créer une règle de réécriture distincte pour chacun d’entre eux.

  • Exemple 1C: Jeux de caractères correspondants *

Cependant, nous aimerions également spécifier n’importe quel élément, et non le limiter à + ​​/ chaussures. Donc, nous allons faire ce qui suit:

  • Écrivez une expression régulière qui correspond à tous les caractères alphanumériques. L’expression entre crochets + [] + correspond à n’importe quel caractère à l’intérieur, et le + correspond à tout nombre de caractères spécifié dans les crochets

  • Regroupez la correspondance et faites-la référence avec + $ 2 + comme deuxième variable du fichier

/var/www/html/.htaccess

RewriteRule ^([A-Za-z0-9]+)/(men|women|youth) results.php?item=$1&type=$2

L’exemple ci-dessus convertira:

http://example.com/pants/men

to:

http://example.com/results.php?item=pants&type=men

Nous avons étendu avec succès la possibilité de correspondance pour inclure plusieurs aspects d’une URL.

  • Exemple 1D: Transmission de chaînes de requête *

Cette section n’introduit aucun nouveau concept mais aborde un problème qui pourrait survenir. En utilisant l’exemple ci-dessus, supposons que nous voulions rediriger + http: // example.com / pants / men +, mais que nous allons passer une chaîne de requête supplémentaire +? Page = 2 +. Nous aimerions mapper l’URL suivante:

http://example.com/pants/men?page=2

to:

http://example.com/results.php?item=pants&type=men&page=2

Si vous tentiez d’accéder à l’URL ci-dessus avec nos paramètres actuels, vous constateriez que la chaîne de requête + page = 2 + est perdue. Ceci est facilement corrigé en utilisant un indicateur + QSA + supplémentaire, ce qui entraîne la combinaison des chaînes de requête. Si vous modifiez la règle de réécriture afin qu’elle corresponde à ce qui suit, vous obtiendrez le comportement souhaité.

/var/www/html.html

RewriteRule ^([A-Za-z0-9]+)/(men|women|youth) results.php?item=$1&type=$2 [QSA]

Exemple 2: Ajout de conditions avec la logique

Nous allons maintenant examiner l’utilisation de la directive + RewriteCond +. Si une condition de réécriture a la valeur true, Apache considère le + RewriteRule + qui le suit.

  • Exemple 2A: Page par défaut *

Auparavant, nous avions vu Apache gérer une demande d’URL non valide en fournissant une page 404 * Introuvable *. Cependant, au lieu d’une page d’erreur, nous aimerions que toutes les URL malformées soient redirigées vers la page d’accueil. En utilisant une condition, nous pouvons vérifier si le fichier demandé existe.

/var/www/html/.htaccess

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^admin/(.*)$ /admin/home

Cela va rediriger quelque chose comme + / admin / + vers + / admin / home +.

Disséquons la règle ci-dessus:

  • +% {REQUEST_FILENAME} + vérifie la chaîne demandée

  • +! - f + l’opérateur +! + ou * not * indique que si le nom de fichier demandé n’existe pas, exécutez la règle de réécriture suivante.

  • + RewriteRule redirige les demandes vers` + / admin / home + `

Définir le 404 + ErrorDocument + suivrait les meilleures pratiques. Pour ce faire, nous allons créer une règle + ErrorDocument + afin de pointer les erreurs 404 vers une page + error.html +:

/var/www/html/.htaccess

ErrorDocument 404 /error.html

Cela redirige toute demande entraînant une réponse HTTP 404 à la page + error.html.

  • Exemple 2B: Restriction d’adresse IP *

Un + RewriteCond + peut être utilisé pour permettre l’accès à un site avec une adresse IP spécifique.

Cet exemple bloque le trafic de partout * sauf * 198.51.100.24.

/var/www/html/.htaccess

RewriteCond %{REMOTE_ADDR} !^(198\.51\.100\.24)$
RewriteRule (.*) - [F,L]

La règle complète indique que si l’adresse IP à l’origine de la demande de ressources n’est pas 198.51.100.24, n’autorisez pas l’accès.

En bref:

  • +% {REMOTE_ADDR} + est la chaîne d’adresse

  • +! ^ (198 \ .51 \ .100 \ .24) $ + annule l’adresse IP. Les barres obliques inverses + \ + échappent au point +. +, Car sinon, elles servent de métacaractères utilisés pour faire correspondre n’importe quel caractère.

  • L’indicateur + F + interdit l’accès et l’indicateur + L + indique qu’il s’agit de la dernière règle à exécuter, si elle est exécutée.

Si vous préférez * bloquer * l’accès depuis une adresse spécifique, utilisez plutôt le code suivant:

/var/www/html/.htaccess

RewriteCond %{REMOTE_ADDR} ^(198\.51\.100\.24)$
RewriteRule (.*) - [F,L]

Bien que vous puissiez utiliser d’autres méthodes pour bloquer ou autoriser le trafic sur votre site, la configuration de la restriction dans un fichier + .htaccess + est le moyen le plus simple d’obtenir ces résultats.

Conclusion

Dans ce tutoriel, nous avons utilisé un fichier + .htaccess + pour travailler avec les directives + RewriteRule + et + RewriteCond +. Il existe de nombreuses raisons d’utiliser des règles de réécriture et les ressources suivantes détaillent les fonctionnalités du module + mod_rewrite +:

Le module + mod_rewrite + est un composant crucial du serveur Web Apache, et vous pouvez en faire beaucoup. Cependant, les choses ne se passent pas toujours comme prévu et, lorsque cela se produit, vous risquez de vous retrouver avec une boucle de redirection ou une erreur ambiguë +500 interdit +. Pour obtenir des conseils sur le débogage de ce type de situation, consultez la page this de StackOverflow.