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

Module mod_rewrite partie 3

Dans les deux sections précédentes, nous nous sommes familiarisés avec les bases des «règles de réécriture» de l'URL et des «conditions de règles». Permettez-moi de suggérer deux exemples illustrant des applications plus complexes.

Le premier exemple traite des pages dynamiques, et le second montre les possibilités d'appeler des fichiers ".txt" et le produit de diverses actions sur eux.

Supposons que nous ayons un magasin virtuel pour la vente de certains biens. Les clients se réfèrent aux descriptions de produits via le 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 présentées sous forme de liens sur la plupart des pages du site.

Et maintenant disons que vous avez décidé d'ajouter un site pour l'indexation dans les moteurs de recherche. Ensuite, un petit problème vous attend - tous les moteurs de recherche n'acceptent pas, ne comprennent pas et n'indexent pas les URL qui contiennent le symbole "?".

Plus naturel et acceptable pour le 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 "/".

URL encore plus confortable en termes de moteur de recherche ressemblera à:

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

Pour le moteur de recherche, "shop" est maintenant, pour ainsi dire, un répertoire contenant des produits product1, product2, etc.

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

Pour réaliser 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 que l'on appelle les "backreferences". Ils sont associés à des groupes de texte. L'URL appelée est divisée en plusieurs parties. Tout ce qui est avant le "magasin", plus tout ce qui est après "boutique /" est défini et stocké dans ces deux variables: 1 $ et 2 $.

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

Cependant, nous n'avons pas encore réalisé la véritable réécriture des URL, dans le sens où une URL devrait rediriger le visiteur vers un autre.

Pour notre enregistrement comme: RewriteRule ^(.*)shop/(.*)$ $1cgi-bin/shop.cgi?$2 la syntaxe générale est:

RewriteRule currentURL réécritureURL

Comme vous pouvez le voir, cette directive effectue un véritable "écrasement" de l'adresse URL.

En plus des entrées dans le fichier .htaccess, vous devez également remplacer tous les liens sur le site qui ont le format "cgi-bin / shop.cgi? Product", avec des liens comme "shop / product"

Maintenant que le moteur de recherche trouve une page avec des liens similaires, il va indexer le site sans problèmes visibles.

De cette façon, vous pouvez transformer un site purement dynamique en un site qui a une structure statique, ce qui va évidemment bénéficier en matière d'indexation par différentes machines de camions. Faites attention au type d'URL sur ce site. En plus de tout, ils ont aussi une structure facilement lisible pour une personne - CNC (URL à comprendre). Mais nous en parlerons dans un autre article.

Dans notre deuxième exemple, nous verrons comment rediriger les requêtes pour les fichiers ".txt" vers le script du programme.

De nombreux fournisseurs d'hébergement qui travaillent avec Apache fournissent des fichiers journaux dans un format commun. Cela signifie qu'ils ne lieront pas les champs avec les pages référentes et les agents utilisateurs.

Cependant, en ce qui concerne les requêtes au fichier "robots.txt", il est préférable d'avoir accès à toutes ces données afin d'avoir plus d'informations sur la visite des moteurs de recherche que de simplement connaître leurs adresses IP. Pour formaliser ceci, les entrées suivantes devraient être dans .htaccess: RewriteEngine on Options +FollowSymlinks RewriteBase / RewriteRule ^robots.txt$ /text.cgi?%{REQUEST_URI}

Maintenant, en demandant le fichier "robots.txt", notre RewriteRule redirige le visiteur (robot) vers le moteur de requête text.cgi. De plus, la variable est transmise au script, qui sera traitée en fonction de vos besoins. "REQUEST_URI" spécifie le nom du fichier demandé. Dans cet exemple, c'est "robots.txt". Le script lit le contenu de "robots.txt" et l'envoie à un navigateur Web ou à un robot de moteur de recherche. Ainsi, nous pouvons compter les hits des visiteurs et mener leurs fichiers journaux.

Pour ce faire, le script utilisera les variables d'environnement $ ENV {'HTTP_USER_AGENT'}, etc. Cela garantira que toutes les informations requises sont obtenues. Voici la 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 ou DocumentRoot du serveur et définissez les autorisations pour le fichier (chmod) 755. Ensuite, créez le répertoire "stats".

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

Notez 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 donnera-t-il le même effet, et les mêmes adresses IP seront-elles exclues?

L'expression régulière ^ 212.37.64 satisfait et est applicable 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 suivi par n'importe quelle chaîne de caractères. Cependant, la valeur maximale de IP est l'adresse 255.255.255.255 - ce qui implique que par exemple 212.37.642.12 est une adresse IP incorrecte (invalide). La seule adresse IP valide dans la liste ci-dessus est 212.37.64.12!

A suivre ...