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

Mod_rewrite module h.3

Dans les deux parties précédentes, nous avons appris les bases des «règles de réécriture» de l'URL et des «termes des règles». Permettez-moi de suggérer deux exemples à illustrer, illustrant des applications plus complexes.

Le premier exemple concerne les pages dynamiques, le second montre la possibilité d’appeler les fichiers «.txt» et d’y exécuter diverses actions.

Supposons que nous ayons un magasin virtuel vendant certains produits. Les clients accèdent aux descriptions de produits via un script:

http://www.yoursite.com/cgi-bin/shop.cgi?product1
http://www.yoursite.com/cgi-bin/shop.cgi?product2
http://www.yoursite.com/cgi-bin/shop.cgi?product3

Ces adresses sont fournies sous forme de liens sur la plupart des pages du site.

Maintenant, disons que vous décidez d'ajouter un site pour l'indexation dans les moteurs de recherche. Un petit problème vous attend - tous les moteurs de recherche n'acceptent, ne comprennent et n'indexent pas les URL contenant le symbole “?”.

Plus naturelle et acceptable pour un moteur de recherche est l'URL du formulaire:

http://www.yoursite.com/cgi-bin/shop.cgi/product1

Dans ce cas, le symbole "?" Est remplacé par "/".

Une URL encore plus confortable du point de vue du moteur de recherche sera:

http://www.yoursite.com/shop/product1

Pour le moteur de recherche, "boutique" est maintenant, pour ainsi dire, un répertoire contenant les marchandises product1, product2, etc.

Si l'utilisateur de la page de résultats de recherche dans le moteur de recherche suit ce lien, ce lien doit être transformé en lien: shop.cgi? Product1.

Pour obtenir cet effet, vous pouvez utiliser mod_rewrite en utilisant la construction suivante dans le fichier .htaccess: RewriteEngine on Options +FollowSymlinks RewriteBase / RewriteRule ^(.*)shop/(.*)$ $1cgi-bin/shop.cgi?$2

Les variables $ 1 et $ 2 constituent ce qu'on appelle des "références arrière". Ils sont associés à des groupes de texte. L'URL appelée est divisée en parties. Tout ce qui se trouve avant la «boutique», plus tout ce qui se trouve après la «boutique /», est déterminé et stocké dans ces deux variables: 1 $ et 2 $.

Jusqu'à présent, nos exemples utilisaient des «règles» du type: RewriteRule ^.htaccess*$ - [F]

Cependant, nous n'avons pas encore réalisé la réécriture réelle des URL, en ce sens qu'une URL devrait rediriger le visiteur vers un autre.

Pour notre entrée de type: RewriteRule ^(.*)shop/(.*)$ $1cgi-bin/shop.cgi?$2 , la syntaxe générale est la suivante:

RewriteRule currentURL réinscriptibleURL

Comme vous pouvez le constater, cette directive effectue une "réécriture" valide de l'adresse URL.

En plus des entrées du fichier .htaccess, vous devez remplacer tous les liens du site au format "cgi-bin / shop.cgi? Product" par des liens du type: "shop / product".

Désormais, lorsque le moteur de recherche trouvera une page avec des liens similaires, il indexera le site sans problème visible.

De cette manière, vous pouvez transformer un site purement dynamique en un site ayant une structure statique, ce qui sera évidemment utile en matière d’indexation par diverses machines. Faites attention au type d'adresses URL sur ce site. En plus de cela, ils ont aussi une structure facile à lire pour les humains - une CNC (URL lisible par l'homme). Mais nous en parlerons dans un autre article.

Dans notre deuxième exemple, nous verrons comment rediriger les demandes de fichiers «.txt» vers un script de programme.

De nombreux fournisseurs d'hébergement Apache fournissent des fichiers journaux dans un format commun. Cela signifie qu'ils ne contiendront pas de champs avec des pages de référence et des agents d'utilisateur.

Toutefois, en ce qui concerne les demandes dans le fichier «robots.txt», il est préférable d’avoir accès à toutes ces données afin d’avoir plus d’informations sur les visites des moteurs de recherche que de connaître simplement leurs adresses IP. Pour organiser cela, les entrées suivantes doivent être dans “.htaccess”: RewriteEngine on Options +FollowSymlinks RewriteBase / RewriteRule ^robots.txt$ /text.cgi?%{REQUEST_URI}

Désormais, lors de la demande du fichier «robots.txt», notre RewriteRule redirige le visiteur (robot) vers les demandes de traitement de script text.cgi. En outre, la variable est transmise au script, qui sera traité en fonction de vos besoins. "REQUEST_URI" définit le nom du fichier demandé. Dans cet exemple, il s'agit de «robots.txt». Le script lira le contenu du fichier "robots.txt" et l'enverra à un navigateur Web ou à un robot de moteur de recherche. Ainsi, nous pouvons compter les visiteurs et gérer nos fichiers de log.

Pour ce faire, le script utilisera les variables d'environnement "$ ENV {'HTTP_USER_AGENT'}", etc. Cela fournira toutes les informations requises. Voici le texte source du script cgi mentionné ci-dessus: #!/usr/bin/perl # If required, adjust line above to point to Perl 5. ################################# # (c) Copyright 2000 by fantomaster.com # # All rights reserved. # ################################# $stats_dir = "stats"; $log_file = "stats.log"; $remote_host = "$ENV{'REMOTE_HOST'}"; $remote_addr = "$ENV{'REMOTE_ADDR'}"; $user_agent = "$ENV{'HTTP_USER_AGENT'}"; $referer = "$ENV{'HTTP_REFERER'}"; $document_name = "$ENV{'QUERY_STRING'}"; open (FILE, "robots.txt"); @TEXT = ; close (FILE); &get_date; &log_hits ("$date $remote_host $remote_addr $user_agent $referer $document_name "); print "Content-type: text/plain "; print @TEXT; exit; sub get_date { ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(); $mon++; $sec = sprintf ("%02d", $sec); $min = sprintf ("%02d", $min); $hour = sprintf ("%02d", $hour); $mday = sprintf ("%02d", $mday); $mon = sprintf ("%02d", $mon); $year = scalar localtime; $year =~ s/.*?(d{4})/$1/; $date="$year-$mon-$mday, $hour:$min:$sec"; } sub log_hits { open (HITS, ">>$stats_dir/$log_file"); print HITS @_; close (HITS); } #!/usr/bin/perl # If required, adjust line above to point to Perl 5. ################################# # (c) Copyright 2000 by fantomaster.com # # All rights reserved. # ################################# $stats_dir = "stats"; $log_file = "stats.log"; $remote_host = "$ENV{'REMOTE_HOST'}"; $remote_addr = "$ENV{'REMOTE_ADDR'}"; $user_agent = "$ENV{'HTTP_USER_AGENT'}"; $referer = "$ENV{'HTTP_REFERER'}"; $document_name = "$ENV{'QUERY_STRING'}"; open (FILE, "robots.txt"); @TEXT = ; close (FILE); &get_date; &log_hits ("$date $remote_host $remote_addr $user_agent $referer $document_name "); print "Content-type: text/plain "; print @TEXT; exit; sub get_date { ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(); $mon++; $sec = sprintf ("%02d", $sec); $min = sprintf ("%02d", $min); $hour = sprintf ("%02d", $hour); $mday = sprintf ("%02d", $mday); $mon = sprintf ("%02d", $mon); $year = scalar localtime; $year =~ s/.*?(d{4})/$1/; $date="$year-$mon-$mday, $hour:$min:$sec"; } sub log_hits { open (HITS, ">>$stats_dir/$log_file"); print HITS @_; close (HITS); }

Téléchargez le fichier avec ce contenu dans le répertoire racine du serveur DocumentRoot et définissez les autorisations sur le fichier (chmod) 755. Créez ensuite le répertoire «stats».

Si les paramètres de votre serveur ne permettent pas l'exécution de scripts cgi dans le répertoire principal (DocumentRoot), essayez l'option suivante: RewriteRule ^robots.txt$ /cgi-bin/text.cgi?%{REQUEST_URI}

Veuillez noter que dans ce cas, il sera nécessaire de changer les chemins dans le code du script!

Enfin, voici la solution au problème donné dans la partie précédente de cette publication: RewriteCond %{REMOTE_ADDR} ^212.37.64 RewriteRule ^.*$ - [F]

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?

L'expression régulière ^ 212.37.64 vérifie et s'applique aux lignes suivantes:

212.37.64
212.37.640
212.37.641
212.37.64a
212.37.64abc
212.37.64.12
212.37.642.12

Par conséquent, le dernier chiffre "4" peut être accompagné d'une chaîne de caractères quelconque. Toutefois, la valeur IP maximale est l'adresse 255.255.255.255 - ce qui implique que, par exemple, 212.37.642.12 est une adresse IP incorrecte (non valide). La seule adresse IP valide dans la liste ci-dessus est 212.37.64.12!

A suivre ...