This page has been robot translated, sorry for typos if any. Original content here.

Module mod_rewrite partie 2

Dans le dernier chapitre, nous avons présenté les bases du module mod_rewrite. Dans l'exemple considéré, nous avons utilisé une construction qui signifie littéralement ce qui suit: «Si quelqu'un tente d'accéder au fichier .htaccess, une erreur est signalée, indiquant que l'accès au fichier est refusé».

Cette «règle» est globale, c'est-à-dire que tout le monde recevra le message d'erreur indiqué. Rappelez-vous que mod_rewrite est un module qui fournit un "mécanisme basé sur des règles pour modifier dynamiquement les URL demandées".

Nous pouvons limiter la «règle» avec diverses «conditions de règle». La «règle» ne sera remplie que si un certain nombre de conditions sont remplies.

Syntaxe : la condition doit précéder la règle!

Prenons un autre exemple (une entrée du fichier .htaccess): RewriteEngine on Options +FollowSymlinks RewriteBase / RewriteCond %{HTTP_USER_AGENT} ^EmailSiphon RewriteRule ^.*$ - [F]

L’objet des trois premières entrées a été détaillé dans la première partie de la publication. Leur fonction est d'activer le "moteur de réécriture", c'est-à-dire le module lui-même.

Les deux dernières lignes interdisent l'accès au robot de recherche portant le nom de code «EmailSiphon» (agent de nom d'utilisateur). Ce robot est un collecteur d'adresses électroniques provenant de différentes pages Web.

Ligne: RewriteCond %{HTTP_USER_AGENT} ^EmailSiphon

se compose de trois parties:

Directive (directive): RewriteCond
Chaîne de vérification:% {HTTP_USER_AGENT}
Exemples de termes: ^ EmailSiphon

La chaîne de contrôle est une variable serveur qui peut être écrite sous la forme générale: "% {NAME_VARIABLE}".

La condition d'échantillon est une expression régulière. Pour une compréhension plus complète du sujet, vous devez considérer les expressions régulières en tant que classe.

Expressions régulières

Les expressions régulières sont un mécanisme qui vous permet de spécifier un modèle pour une chaîne et de rechercher des données correspondant à ce modèle dans un texte donné. De plus, des fonctions supplémentaires pour travailler avec de telles expressions vous permettent d’obtenir les données trouvées sous la forme d’un tableau de chaînes, d’en remplacer le texte sur le modèle, de scinder la chaîne sur le modèle, etc. Cependant, leur fonction principale, sur laquelle tous les autres sont basés, est précisément la fonction de recherche dans le texte de données correspondant au modèle (modèle) décrit dans la syntaxe d'expression régulière.

Les expressions régulières sont comme un petit langage de programmation compact avec ses propres règles.

Par exemple, une expression régulière: s/abc/xyz/g

remplacera la chaîne "abc" par la chaîne "xyz" dans tout le texte.

Voici un bref aperçu des éléments les plus importants avec quelques exemples:

. (point) - texte (n'importe quel caractère)
| - alternance (c'est-à-dire / abc | def /)
* - quantificateur (n'importe quel nombre est possible)
^ $ - ancres de chaîne
s - opérateur (remplace string1 par string2)
g - modificateur (recherche dans le texte entier)

Les expressions régulières sont construites à l'aide de ces éléments et d'autres caractères "ordinaires". Ils ne sont pas une langue séparée, mais sont utilisés par d'autres moyens, tels que des langages de programmation tels que Perl ou PHP , ainsi que des éditeurs de texte (Emacs).

Si nous parlons de la relation entre les expressions régulières et le module mod_rewrite, elles sont utilisées dans les directives RewriteRule et RewriteCond.

“^” Indique le début d'une ligne. Il s'ensuit que UserAgent doit commencer par la chaîne «EmailSiphon» et rien d'autre («NewEmailSiphon», par exemple, ne fonctionnerait pas).

Mais, comme cette expression régulière ne contient pas le caractère "$" (ancre de fin de ligne), UserAgent pourrait être, par exemple, "EmailSiphon2".

La dernière ligne de notre exemple: RewriteRule ^.*$ - [F]

détermine ce qui doit être fait lorsque le robot demande l'accès.

L'expression régulière "^. * $" Signifie: "L'accès à tous les fichiers est refusé."

Le point "." Dans une expression régulière est un méta-symbole (caractère générique), ce qui signifie tout symbole aléatoire.

“*” Signifie qu'une chaîne peut se produire un nombre illimité de fois. Dans ce cas, quel que soit le nom du fichier demandé, une erreur sera générée.

EmailSiphon n'est certainement pas le seul collecteur de courrier. «ExtractorPro» est un autre membre connu de cette famille. Supposons que nous voulions refuser l'accès à ce robot. Dans ce cas, nous avons besoin d'une autre condition.

Maintenant, le fichier .htaccess ressemblera à ceci: RewriteEngine on Options +FollowSymlinks RewriteBase / RewriteCond %{HTTP_USER_AGENT} ^EmailSiphon [OR] RewriteCond %{HTTP_USER_AGENT} ^ExtractorPro RewriteRule ^.*$ - [F]

Le troisième argument [OU] (dans la première ligne de RewriteCond) est appelé le "drapeau". Il y a deux drapeaux possibles:

NC - ignorer la casse des lettres.
OU - signifie "ou la condition suivante."

Le drapeau NC vous permet d’ignorer la casse des lettres dans le motif souhaité. Par exemple: RewriteCond %{HTTP_USER_AGENT} ^emailsiphon [NC]

Cette ligne spécifie que emailsiphon et EmailSiphon seront reconnus comme des expressions identiques.

Vous pouvez utiliser plusieurs indicateurs à la fois, séparés par des virgules. RewriteCond % {HTTP_USER_AGENT} ^EmailSiphon [NC, OR] RewriteCond % {HTTP_USER_AGENT} ^ExtractorPro

Il n'y a pas de restrictions sur le nombre de conditions. Ainsi, vous pouvez bloquer 10, 100, 1000 ou plus de collecteurs de courrier connus. La définition de ces 1000 conditions dépend simplement de la charge du serveur et de la transparence du fichier .htaccess.

Dans l'exemple ci-dessus, la variable globale "HTTP_USER_AGENT" est utilisée. Il y a aussi d'autres variables:

REMOTE_HOST
REMOTE_ADDR

Par exemple, si vous souhaitez bloquer une araignée provenant de www.site.ru, vous pouvez utiliser la variable globale “REMOTE_HOST” comme ceci: RewriteCond % {REMOTE_HOST} ^www.site.ru$ RewriteRule ^.*$ - [F]

Si vous souhaitez bloquer une adresse IP spécifique, la condition ressemblera à ceci: RewriteCond % {REMOTE_ADDR} ^212.37.64.10$ RewriteRule ^.*$ - [F]

Dans l'expression régulière pour vérifier l'adresse IP exacte et complète, vous devez utiliser les ancres initiale et finale.

Vous pouvez également exclure toute la plage: RewriteCond %{REMOTE_ADDR} ^212.37.64. RewriteRule ^.*$ - [F] RewriteCond %{REMOTE_ADDR} ^212.37.64. RewriteRule ^.*$ - [F]

Cet exemple montre comment bloquer la plage d'adresses IP allant de 212.37.64.0 à 212.37.64.255.

Mais une petite tâche pour tester les connaissances acquises (la solution sera donnée dans la prochaine partie): RewriteCond %{REMOTE_ADDR} ^212.37.64 RewriteRule ^.*$ - [F]

Attention, la question!

Si nous écrivons dans l'expression régulière "^ 212.37.64" au lieu de "^ 212.37.64." (Avec un point à la fin), cela aura-t-il le même effet et les mêmes adresses IP seront-elles exclues?

Jusqu'à présent, nous avons utilisé une simple rewriteRule qui génère un message d'erreur. Dans la troisième partie de la publication, nous analyserons comment vous pouvez utiliser RewriteRule pour rediriger les visiteurs vers des fichiers spécifiques.