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

Module mod_rewrite Partie 2

Dans le dernier chapitre, nous nous sommes familiarisés avec 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 émise indiquant que l'accès au fichier est interdit."

Cette "règle" est globale, c'est-à-dire que chacun recevra le message d'erreur spécifié. Je vous rappelle que mod_rewrite est un module qui fournit un "mécanisme basé sur des règles pour changer dynamiquement les URL demandées".

Nous pouvons limiter la "règle" à l'aide de diverses "conditions de règles". La "règle" ne sera remplie que si un certain nombre de conditions sont remplies avant elle.

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

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

Le but des trois premiers enregistrements a été discuté en détail 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, nommé "EmailSiphon" (c'est-à-dire le nom de l'agent utilisateur). Ce robot est le collecteur d'adresses de courrier de diverses pages Web.

Ligne: RewriteCond %{HTTP_USER_AGENT} ^EmailSiphon

se compose de trois parties:

Directive (désignation): RewriteCond
Chaîne de vérification:% {HTTP_USER_AGENT}
Condition de l'échantillon: ^ EmailSiphon

La chaîne de vérification est une variable de serveur qui peut être écrite sous la forme générale: "% {APPLICATION_NAME}".

Un exemple de condition est une expression régulière. Pour une compréhension plus complète du sujet, considérez les expressions régulières comme une 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 rechercher des données correspondant à ce modèle dans le texte spécifié. 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, de faire un remplacement dans le texte du modèle, de séparer la ligne par le modèle, et ainsi de suite. Cependant, leur fonction principale, sur laquelle reposent tous les autres, est précisément la fonction de recherche dans le texte de données correspondant au motif décrit dans la syntaxe des expressions régulières.

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

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

remplacera la chaîne "abc", par la ligne "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 (tout nombre est possible)
^ $ - ligne d'ancrage
s - operator (remplacez string1 par string2)
g - modificateur (recherche tout le texte)

Les expressions régulières sont construites en utilisant ces éléments et d'autres symboles "ordinaires". Ils ne sont pas un langage séparé, mais sont utilisés par d'autres moyens, par exemple, 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 mod_rewrite, elles sont utilisées dans les directives RewriteRule et RewriteCond.

"^" Indique le début de la ligne. Il s'ensuit que l'UserAgent devrait commencer par la ligne "EmailSiphon" et rien d'autre ("NewEmailSiphon", par exemple, ne fonctionnerait pas).

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

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

Il détermine ce que vous devez faire lorsque le robot demande l'accès.

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

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

"*" Signifie que la 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", bien sûr, n'est pas le seul collecteur postal. Un autre membre bien connu de cette famille est ExtractorPro. Supposons que nous voulons refuser l'accès à ce robot. Dans ce cas, nous avons besoin d'une condition supplémentaire.

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 [OR] (dans la première ligne de RewriteCond) s'appelle le "drapeau". Il y a deux drapeaux possibles:

NC - non sensible à la casse.
OU signifie "ou la condition suivante".

La case à cocher NC vous permet d'ignorer le cas des lettres dans l'échantillon. 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 cases en même temps, en les séparant 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 plusieurs collecteurs de courrier connus. La définition de ces 1000 conditions est simplement une question de chargement du serveur et de 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 voulez bloquer une araignée de www.site.ru, vous pouvez utiliser la variable globale "REMOTE_HOST" de cette manière: 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 vous pouvez bloquer la plage d'adresses IP de 212.37.64.0 à 212.37.64.255.

Et voici un petit puzzle pour tester les connaissances acquises (la solution sera donnée dans la partie suivante): RewriteCond %{REMOTE_ADDR} ^212.37.64 RewriteRule ^.*$ - [F]

Attention, une 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 donnera-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 allons analyser comment vous pouvez utiliser RewriteRule pour rediriger les visiteurs vers des fichiers spécifiques.