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:
-
Une nouvelle Ubuntu 14.04 Droplet
-
Un utilisateur sudo non root, que vous pouvez configurer en suivant les étapes 2 et 3 de https://www.digitalocean.com/community/tutorials/how-to-add-and-delete-users-on-an-ubuntu -14-04-vps [ce tutoriel]
É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.