Comment configurer mod_rewrite pour Apache sur Ubuntu 14.04

introduction

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

Ce guide est divisé en deux parties: la première configuration d’un exemple d’application Web et la seconde explique les règles de réécriture couramment utilisées.

Conditions préalables

Pour suivre ce tutoriel, vous aurez besoin de:

Étape 1 - Installer Apache

Dans cette étape, nous utiliserons un programme d’installation de paquet intégré appelé + apt-get. Cela simplifie considérablement la gestion et facilite une installation propre.

Commencez par mettre à jour l’index de package du système. Cela garantira que les paquets anciens ou obsolètes n’interfèrent pas avec l’installation.

sudo apt-get update

Apache2 est le serveur HTTP susmentionné et le plus utilisé dans le monde. Pour l’installer, lancez ce qui suit:

sudo apt-get install apache2

Pour plus d’informations sur les différences entre Nginx et Apache2, les deux serveurs Web open source les plus populaires, voir cet article.

Étape 2 - Activer mod_rewrite

Maintenant, nous devons activer + mod_rewrite +.

sudo a2enmod rewrite

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

sudo service apache2 restart

Étape 3 - Configuration de .htaccess

Dans cette section, nous allons configurer un fichier + .htaccess + pour simplifier la gestion des règles de réécriture.

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.

Tout d’abord, autorisez les modifications dans le fichier + .htaccess. Ouvrez le fichier de configuration Apache par défaut en utilisant + nano + ou votre éditeur de texte favori.

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

Dans ce fichier, vous trouverez le bloc + <VirtualHost *: 80> + sur la ligne 1. À l’intérieur de ce bloc, ajoutez le bloc suivant:

/etc/apache2/sites-available/default<Directory /var/www/html>
               Options Indexes FollowSymLinks MultiViews
               AllowOverride All
               Order allow,deny
               allow from all
</Directory>

Votre fichier doit maintenant correspondre à ce qui suit. Assurez-vous que tous les blocs sont correctement mis en retrait.

/etc/apache2/sites-available/default<VirtualHost *:80>
   <Directory /var/www/html>

       . . .

   </Directory>

   . . .
</VirtualHost>

Pour appliquer ces modifications, redémarrez Apache.

sudo service apache2 restart

Maintenant, créez le fichier + .htaccess.

sudo nano /var/www/html/.htaccess

Ajoutez cette première ligne en haut du nouveau fichier pour activer le + RewriteEngine +.

/var/www/html/.htaccessRewriteEngine on

Enregistrez et quittez le fichier.

Pour vous assurer que les autres utilisateurs ne peuvent que read votre + .htaccess +, exécutez la commande suivante pour mettre à jour les autorisations.

sudo chmod 644 /var/www/html/.htaccess

Vous avez maintenant un fichier + .htaccess opérationnel pour régir les règles de routage de votre application Web.

Étape 4 - Configuration des fichiers

Dans cette section, 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 à + ​​/ about +.

Nous allons commencer par créer un fichier nommé + about.html.

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

Copiez le code suivant dans la page HTML.

/var/www/html/about.html<html>
   <head>
       <title>About Us</title>
   </head>
   <body>
       <h1>About Us</h1>
   </body>
</html>

Vous pouvez accéder à votre application Web via + / about.html ou` + / about.html`. Notez maintenant que seul + about.html est accessible; Si vous essayez d’accéder à + ​​/ about, vous obtiendrez une erreur * Introuvable *. Nous aimerions que les utilisateurs accèdent à + ​​about + à la place. Nos règles de réécriture permettront cette fonctionnalité même.

Ouvrez le fichier + .htaccess.

sudo nano /var/www/html/.htaccess

Après la première ligne, ajoutez ce qui suit.

/var/www/html/.htaccessRewriteRule ^about$ about.html [NC]

Votre fichier devrait maintenant être identique à la suivante.

/var/www/html/.htaccessRewriteEngine on
RewriteRule ^about$ about.html [NC]

Toutes nos félicitations. Vous pouvez maintenant accéder à + ​​/ about + dans votre navigateur!

C’est un bon exemple simple qui montre la syntaxe générale suivie par toutes les règles de réécriture.

+ ^ environ $ + est la chaîne qui correspond à l’URL. C’est-à-dire que c’est ce que la visionneuse tape dans son navigateur. Notre exemple utilise quelques metacharacters.

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

  • + $ + indique la fin de l’URL

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

+ about.html + est le chemin réel auquel l’utilisateur accède; En d’autres termes, Apache servira toujours le fichier + about.html +.

+ [NC] + est un flag qui ignore la capitalisation dans l’URL.

Avec la règle ci-dessus, les URL suivantes pointeront sur + about.html:

  • + / about +

  • + / About +

  • + / about.html

Ce qui suit ne sera pas:

  • + / about / +

  • + / contact +

Patterns communs

Dans cette section, nous allons montrer quelques directives couramment utilisées.

Votre application Web est en cours d’exécution et est régie par un fichier + .htaccess protégé. L’exemple le plus simple a été inclus ci-dessus. Nous allons explorer deux autres exemples dans cette section.

Vous pouvez configurer des exemples de fichiers dans les chemins de résultats si vous le souhaitez, mais ce tutoriel n’inclut pas la création de fichiers HTML et PHP; juste les règles pour la réécriture.

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

Tous les + RewriteRule + respectent le format suivant:

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

  • * pattern *: une expression régulière qui correspond à la chaîne souhaitée

  • * substitution *: chemin d’accès à l’URL réelle

  • * flags *: paramètres optionnels pouvant modifier la règle

Les applications Web utilisent souvent query strings, qui sont ajoutées à une URL à l’aide du point d’interrogation +? + Et délimitées à l’aide du caractère + & +. Celles-ci sont ignorées lors de la mise en 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, une page de résultat de recherche écrite en PHP peut utiliser quelque chose qui ressemble à ce qui suit:

http://example.com/results.php?item=shirt&season=summer

Dans cet exemple, nous aimerions simplifier ceci pour devenir:

http://example.com/shirt/summer
  • Exemple 1A: Remplacement simple *

En utilisant une règle de réécriture, nous pourrions utiliser les éléments suivants:

/var/www/html/.htaccessRewriteRule ^shirt/summer$ results.php?item=shirt&season=summer

Ce qui précède est assez explicite, car il associe en fait + shirt / summer + à + ​​results.php? Item = shirt & season = summer +. Ceci réalise notre effet désiré.

  • Exemple 1B: Options de correspondance *

Cependant, nous aimerions généraliser ceci pour inclure toutes les saisons. Donc, nous allons faire ce qui suit:

  • Spécifiez une série d’options en utilisant le booléen + | +, ce qui signifie «OU»

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

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

/var/www/html/.htaccessRewriteRule ^shirt/(summer|winter|fall|spring) results.php?item=shirt&season=$1

La règle ci-dessus correspond à une URL de + shirt / + suivie d’une saison spécifiée. Cette saison est groupée en utilisant + () + puis référencée avec le + $ 1 + dans le chemin suivant. Cela signifie que, par exemple, que:

http://example.com/shirt/winter

devient:

http://example.com/results.php?item=shirt&season=winter

Cela permet également d’obtenir l’effet souhaité.

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

Cependant, nous aimerions également spécifier tout type d’élément, pas seulement les URL à "+ / shirt +". 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 à n’importe quel 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/.htaccessRewriteRule ^([A-Za-z0-9]+)/(summer|winter|fall|spring) results.php?item=$1&season=$2

Ce qui précède convertira, par exemple:

http://example.com/pants/summer

to:

http://example.com/results.php?item=pants&season=summer
  • 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 / summer +, mais que nous allons passer une chaîne de requête supplémentaire +? Page = 2 +. Nous aimerions ce qui suit:

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

mapper à:

http://example.com/results.php?item=pants&season=summer&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 + a été perdue. Ceci est facilement corrigé en utilisant un indicateur + QSA + supplémentaire. Modifiez la règle de réécriture pour qu’elle corresponde à ce qui suit et vous obtiendrez le comportement souhaité.

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

Exemple 2: Ajout de conditions avec la logique

+ RewriteCond + nous permet d’ajouter des conditions à nos règles de réécriture. Tous les + RewriteCond + respectent le format suivant:

RewriteCond TestString Condition [Flags]
  • * RewriteCond *: spécifie la directive + RewriteCond +

  • * TestString *: la chaîne contre laquelle tester

  • * Condition *: le motif à assortir

  • * Drapeaux *: paramètres facultatifs susceptibles de modifier la condition

Si un + RewriteCond + a la valeur true, le + RewriteRule + qui suit immédiatement sera pris en compte.

  • Exemple 2A: Page par défaut *

Dans un panneau d’administration imaginaire, il peut être utile de rediriger toutes les URL malformées vers la page d’accueil au lieu d’accueillir les utilisateurs avec un 404. En utilisant une condition, nous pouvons vérifier si le fichier demandé existe.

/var/www/html/.htaccessRewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^admin/(.*)$ /admin/home

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

Avec ce qui précède:

  • +% {REQUEST_FILENAME} + est la chaîne à vérifier

  • +! - f + utilise l’opérateur +! + not sur le nom du fichier

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

Notez qu’une approche plus correcte sur le plan syntaxique et technique consisterait à définir 404 + ErrorDocument +.

/var/www/html/.htaccessErrorDocument 404 /error.html
  • Exemple 2B: Restriction d’accès IP *

Bien que cela puisse également être réalisé en utilisant d’autres méthodes, un + RewriteCond + peut être utilisé pour restreindre l’accès à une adresse IP ou à une collection d’adresses IP.

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

/var/www/html/.htaccessRewriteCond %{REMOTE_ADDR} !^(12\.34\.56\.789)$
RewriteRule (.*) - [F,L]

Cet exemple est simplement la négation de Example 3 de l’ancien article mod_rewrite. La déclaration complète se lit comme suit: «Si l’adresse est not 12.34.56.789, n’autorisez pas l’accès.»

En bref:

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

  • +! ^ (12 \ .34 \ .56 \ .789) $ + échappe à toutes les périodes '+. + Avec une barre oblique inversée + \ + et annule l’adresse IP en utilisant +! + `

  • Le drapeau + F + interdit l’accès, et le drapeau + 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 * 12.34.56.789, utilisez plutôt ceci:

/var/www/html/.htaccessRewriteCond %{REMOTE_ADDR} ^(12\.34\.56\.789)$
RewriteRule (.*) - [F,L]

Vous pouvez trouver davantage de règles de réécriture et savoir comment éviter les liens dynamiques dans les articles part 1 et https: // de l’article d’origine. www.digitalocean.com/community/tutorials/how-to-set-up-mod_rewrite-page-2[part 2].

Conclusion

+ mod_rewrite + peut être utilisé efficacement pour garantir des URL lisibles par l’homme. Le fichier + .htaccess + a lui-même beaucoup plus d’utilisations que ce module, cependant, il convient de noter que de nombreux autres modules Apache peuvent être installés pour étendre ses fonctionnalités.

Il existe d’autres ressources qui détaillent les capacités de + mod_rewrite +:

+ mod_rewrite + est un module essentiel pour la sécurité des applications Web, mais peut parfois aboutir à des boucles de redirection ou à des erreurs omniprésentes et ambiguës 500 interdites + `. Pour des astuces sur le débogage ` .htaccess +`, voir his cet article de StackOverflow.

Les règles de réécriture sont écrites avec des expressions régulières. Pour devenir un expert, référencez cette tutorial tout sur les expressions régulières.

Pour une analyse rapide de vos modèles d’expression régulière, voici un débogueur online capable de fournir un retour immédiat et une interprétation en direct de vos modèles d’expression régulière.