Bonjour,
J'ai un freeware de recherche. Je voudrais y mettre un require pour un fichier html :
Mais cela ne marche pas.
Si je lance la recherche : http://www.tout-pour-le-bien-etre. [...] herche.php
Il y a le message :
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator to inform of the time the error occurred and of anything you might have done that may have caused the error.
More information about this error may be available in the server error log Web Server at tout-pour-le-bien-etre.com
Le require est situé Ligne 404 de ce script, dans la partie affichage de résultats
Merci si vous pouvez me dire ce qui se passe, car je ne connais pas Perl
#!/usr/bin/perl
# Ce script nécessite perl 5.
# En cas d'erreur (et pour serveur Linux souvent),
# réessayez en changeant la première ligne en: #!/usr/bin/perl
print ("Content-type: text/htmlnn" );
# farfouineur.pl : script de recherche de document. (MOTEUR DE RECHERCHE INTERNE) #
# Dans votre répertoire cgi-bin, téléchargez ce script en mode ASCII, chmod 755. #
# Téléchargez aussi, la page farfouineur.html permettant de lancer une recherche, #
# dans un répertoire où vous mettez vos pages HTML normales. #
# v2.02 01/10/1999
$version='2.02';
###################################################################################
# Ceci est un script CGI en Perl freeware, réalisé par Sébastien Joncheray. #
# Vous pouvez l'utiliser gratuitement, à la condition de ne #
# pas changer son contenu, notamment, les parties faisant mentions de l'auteur. #
# De nombreux autres scripts perl en francais, sont disponibles gratuitement à #
# http://www.perl-gratuit.com #
# E-mail pour toute question, remarque : info@perl-gratuit.com #
# Contactez-moi pour tout tout autre script personnalisé #
# permettant une réelle interaction avec l'internaute. #
###################################################################################
# Tous droits de modification/distribution/vente réservés #
# Merci de me contacter dans ces cas là :-) #
###################################################################################
##############################################################################
## Méthode de scoring de chaque page html : #
## 1 point à chaque fois qu'un mot-clé est trouvé dans la page html #
## 4 point en +, pour chaque mot-clé trouvé dans le titre de la page html #
## 3 point en +, pour chaque mot-clé trouvé dans la description de la page #
## 2 point en +, pour chaque mot-clé trouvé dans les META KEYWORD de la page #
##############################################################################
##################################################################################
# Configuration des Variables #
##################################################################################
# POUR DESACTIVER UNE LIGNE METTEZ UN DIESE (#) DEVANT, et vice-versa #
##################################################################################
# Les détections automatiques ci-dessous fonctionnent bien sur serveur Apache, #
# et tous les autres aussi en principe, à moins que la configuration du serveur #
# ou du site soit spéciale (souci probable en cas de sous-hébergement par exemple#
# c'est à dire si votre site n'est pas accessible directement par le seul nom de #
# domaine : votre site=http://www.votre-domaine.com : OK #
# votre site=http://www.hebergeur.com/votresite/ : Pas OK... ) #
##################################################################################
# URL complète de ce script : #################################################
# - Soit vous laissez faire la détection automatique : #
$cgiurl='http://'.$ENV{'SERVER_NAME'}.$ENV{'SCRIPT_NAME'};
# - Soit vous enlevez le dièse (#) ci-dessous et modifiez la ligne: #
# $cgiurl='http://www.votre-site.com/cgi-bin/farfouineur.pl'; #
###############################################################################
# Indiquez ci-dessous le répertoire de base des pages html de votre site ######
# AVEC slash '/' final ######
# - Soit vous laissez faire la détection automatique : #
$basedir=$ENV{'DOCUMENT_ROOT'};
# - Soit vous enlevez le dièse ci-dessous et modifier le chemin en relatif, #
# par rapport à l'emplacement de ce script : #
# $basedir = '../../'; #
# - Soit Idem en absolu : #
# $basedir = '/home/user/httpdocs/'; #
# #
# Laissez la ligne ci-dessous qui vérifie que $basedir finit bien par un / : #
if ($basedir!~ //$/) {$basedir.='/';}
###############################################################################
# Indiquez ci-dessous votre homepage AVEC un / final ##########################
# - Soit vous laissez faire la détection automatique : #
$baseurl='http://'.$ENV{'SERVER_NAME'};
# - Soit vous enlevez le # de la ligne ci-dessous, et la modifiant. #
# $baseurl = 'http://www.perl-gratuit.com/'; #
# Laissez la ligne ci-dessous qui vérifie que $baseurl finit bien par un / :#
if ($baseurl!~ //$/) {$baseurl.='/';}
###############################################################################
# Indiquez ci-dessous, les extensions de fichier dans lesquel le script peut #
# faire la recherche #
@file_types=('.html','.htm','.shtml');
###############################################################################
# Indiquez ci-dessous la liste complète des répertoires et sous-répertoire #
# dans laquelle le script peut faire la recherche. #
# Mettez les noms de répertoires par rapport au répertoire de base de vos #
# pages html ($basedir). #
# Les noms de répertoire ne doivent pas commencer par un slash /,mais doivent #
# finir par un slash /. #
# Ne mettez pas de noms de répertoires qui n'existent pas ! #
@dirs=(
'',
);
# Attention, pas de virgule avant la dernière parenthèse ci-dessus ! #
#
# Done FIN DE LA CONFIGURATION !! #
##############################################################################
# Récupération des données
if (!$ENV{'QUERY_STRING'}) { # Aucun paramètre. Afficher le formulaire seulement
&header; # Affiche haut de page
&formulaire; # Affiche formulaire
&footer; # Affiche bas de page
exit; # Quitter !
}
%form=&receiveget; # Récupération des données du formulaire
if ($form{'command'} eq 'aide') { # Afficher l'Aide
&aide; # Affiche l'Aide
exit; # Quitter !
}
$form{'terms'}=~ s/+//g; # élimine les +
$form{'terms'}=~ s/://g; # élimine les :
$form{'terms'}=~ s/"//g; # élimine les "
@keyword= split(/s+/, $form{'terms'}); # Tableau des mots-clés tapés par le visiteur (séparation espace)
$nb_keyword=@keyword; # Nombre de mots de recherche
%result=(); # Tableau des résultats
%score=(); # Score de chaque fichier
%title=(); # Table de hachage des titres des fichiers
%description=(); # Table de hachage des description des fichiers
%date=(); # Table de hachage des date/heure de dernière modification des fichiers
%metakeyword=(); # Table de hachage des meta keywords des fichiers
%size=(); # Table de hachage des tailles des fichiers
# Chercher la liste des fichiers à explorer
@files=(); # Tableau liste des fichiers.
&files_list; # Rempli @files de la listes des fichiers à explorer.
# Farfouiner dans les fichiers
&search_and_save;
# On élimine les fichiers ne comportant pas ce que l'on cherche
&eliminer;
$nb_fichier=@files;
# Mettre un Score à chaque fichier
&score;
# Tri par score décroissant
&trier;
$max_score=$score{$files[0]}; # Le score maxi est celui du premier fichier après tri
# Page de résultats
$fini=0; # va se mettre à 1 si tous les résultats ont été affichés
&header;
&formulaire;
&affiche_resultat;
&liens_suite;
&footer;
1;
################################################
sub receiveget {
local(%postdata)=();
if ($ENV{'REQUEST_METHOD'} eq 'GET') {
local ($data)=''; # Chaine envoyée
$data=$ENV{'QUERY_STRING'};
foreach $d (split('&',$data)) { # séparation de la chaine par paires
local ($nom,$valeur)=split('=',$d); # paires séparées
$nom=&url_decode($nom);
$valeur=&url_decode($valeur);
$postdata{$nom}=$valeur; # paires rangées dans data
}
} else {
print ("Content-type: text/htmlnn<H1>webmaster says : GET Error in CGI method <BR>GO BACK and TRY again</H1>Vous ne pouvez accéder ici par ce moyen." );
die ("webmaster says : GET Error in CGI method" ) ;
}
return %postdata ;
}
################################################
sub url_decode {
local ($s)=@_;
$s=~ tr/+/ /;
$s=~ s/%([0-9A-F][0-9A-F])/pack("C",oct("0x$1" ))/ge;
$s;
}
################################################
sub files_list {
local ($file)='';
local ($type)='';
local ($flag)=0;
foreach $dir (@dirs) { # on ouvre chaque répertoire indiqué dans @dirs
$dir=~ s/^///; # enlève le / éventuel de début de répertoire
opendir (MYDIR,"$basedir$dir" ) || (print "impossible de lire dans le répertoire $basedir$dir :$!" and exit);
while ($newfile=readdir(MYDIR)) { # pour chaque fichier du répertoire
if ((!(-d "$basedir$dir$newfile" )) && (-T "$basedir$dir$newfile" )) { ## on s'assure que ce n'est pas un répertoire, et que c'est un fichier texte
$flag=0;
foreach $type (@file_types) {
if ($newfile=~ /$type$/) {
$flag=1; # c'est un fichier avec une extension valide
}
}
if ($flag) {
push (@files,"$dir$newfile" );
}
}
}
closedir (MYDIR);
}
}
################################################
################################################
sub search_and_save {
local ($fichier,$mot)=('','');
local ($contenu)='';
local (@lignes)=();
local ($nb,$i,$pp)=(0,0,0);
foreach $fichier (@files) {
open(FILE,"$basedir$fichier" ) || (print "Impossible ouvrir en lecture $basedir$fichier : $!" and exit);
@lignes = <FILE>;
close(FILE);
$contenu = join(' ',@lignes); # Les lignes sont mises bout à bout, séparées par un espace
@lignes=(); # On libère de l'espace mémoire.
$size{$fichier}=int((length($contenu)+500)/1000); # taille en octets du fichier, arrondie au plus près.
$contenu =~ s/n//g; # On enlève les retours à la ligne.
$contenu =~ s/r//g; # Au cas où ...
$contenu =~ s/é/é/g; # Remplace les é de la page html en é
$contenu =~ s/è/è/g; # Remplace les è de la page html en è
$contenu =~ s/à/à/g; # Remplace les à de la page html en à
$contenu =~ s/ê/ê/g; # Remplace les ê de la page html en ê
$contenu =~ s/ç/ç/g; # Remplace les ç de la page html en ç
# on pourrait ajouter d'autres conversions des codes html (ô,ù, ...), mais cela alourdit le temps de traitement,
# on se contente donc des plus courants.
##### CHERCHER LE TITRE ####
if (($contenu=~ /<title>([^<]*)</title>/i) && (length($1)>0)) {
$titre{$fichier}=$1;
}else {
$titre{$fichier}='? nbsp; ? ?'; # Titre de la page inconnu
}
##### CHERCHER LA DESCRIPTION ####
if (($contenu=~ /<meta[^>]*name="description"[^>]*content="([^"]*)">/i) && (length($1)>0)) {
$description{$fichier}=$1;
}else {
$description{$fichier}=''; # Pas de description
}
##### CHERCHER LES META KEYWORD ####
if (($contenu=~ /<meta[^>]*name="keyword[^"]*"[^>]*content="([^"]*)">/i) && (length($1)>0)) {
$metakeyword{$fichier}=$1;
}else {
$metakeyword{$fichier}=''; # Pas de META KEYWORD
}
##### CHERCHER LA DATE DE DERNIERE MODIFICATION ####
$pp=-M "$basedir$fichier"; # Retourne le nb de jours depuis la dernière modif
$pp=localtime(time()-$pp*86400); # Transforme en date normale.
$date{$fichier}=$pp;
for ($i=0;$i<=$nb_keyword-1;$i++) { # Pour chaque mot de recherche
$contenu2=$contenu; # On travaille sur une variable qui va avoir son contenu rogné
$nb=0; # On reset le nb d'occurences
if ($form{'case'} eq 'Insensitive') { # Si peu importe les majuscules/minuscules.
while ($contenu2=~ s/$keyword[$i]/ /i) { # Chaque fois que l'on trouve le mot on le supprime, pour ne pas le compter 2 fois.
$nb++;
}
}else {
while ($contenu2=~ s/$keyword[$i]/ /) { # Idem, en tenant comptedes majuscules/minuscules
$nb++;
}
}
$result{"$fichier.$i"}=$nb; # On range le résultat dans la variable %result()
}
}
}
################################################
################################################
sub eliminer {
local ($i)=0;
local ($fichier)='';
local (@files2)=();
local ($flag)=0;
# D'abord on élimine les noms de fichiers qui n'ont pas de mots-clé recherchés
foreach $fichier (@files) { # Pour chaque fichier.
if ($form{'boolean'} eq 'OR') { # Il suffit qu'on trouve 1 fois le mot-clé pour qu'on garde le fichier
$flag=0;
for ($i=0;$i<=$nb_keyword-1;$i++) { # On prend chaque mot
if ($result{"$fichier.$i"}) { $flag=1;} # si 1 au moins est trouvé dans le fichier, c'est bon
}
}
if ($form{'boolean'} eq 'AND') { # Il faut trouver chaque mot-clé au moins une fois pour qu'on garde le fichier
$flag=1;
for ($i=0;$i<=$nb_keyword-1;$i++) { # On prend chaque mot
if ($result{"$fichier.$i"}==0) { $flag*=0;}# si 1 au moins n'est pas trouvé dans le fichier, c'est pas bon
}
}
if ($flag) { push(@files2,$fichier);} # hop, on sélectionne le fichier !
#print "fichier $fichier, mot $keyword[$i], on garde ? :<b>$flag</b><br>";
}
@files=@files2;
}
################################################
sub score {
local ($fichier)='';
local ($i)=0;
local ($buffer)='';
foreach $fichier (@files) { # Pour chaque fichier.
for ($i=0;$i<=$nb_keyword-1;$i++) { # On prend chaque mot
# On affecte un point par mot-clé trouvé dans le fichier.
$score{$fichier}+=$result{"$fichier.$i"};
# On affecte 4 points en plus par mot-clé trouvé dans le titre de la page.
$buffer=$titre{$fichier};
if ($form{'case'} eq 'Insensitive') { # Si peu importe les majuscules/minuscules.
while ($buffer=~ s/$keyword[$i]/ /i) { # Chaque fois que l'on trouve le mot on le supprime, pour ne pas le compter 2 fois.
$score{$fichier}+=4; # 4 points de plus
#print "<b> 4 pts en plus !</b><br>n";
}
}else {
while ($buffer=~ s/$keyword[$i]/ /) { # Idem, en tenant comptedes majuscules/minuscules
$score{$fichier}+=4; # 4 points de plus
#print "<b> 4 pts en plus !</b><br>n";
}
}
# On affecte 3 points en plus par mot-clé trouvé dans la description de la page.
$buffer=$description{$fichier};
if ($form{'case'} eq 'Insensitive') { # Si peu importe les majuscules/minuscules.
while ($buffer=~ s/$keyword[$i]/ /i) { # Chaque fois que l'on trouve le mot on le supprime, pour ne pas le compter 2 fois.
$score{$fichier}+=3; # 3 points de plus
#print "<b> 3 pts en plus !</b><br>n";
}
}else {
while ($buffer=~ s/$keyword[$i]/ /) { # Idem, en tenant comptedes majuscules/minuscules
$score{$fichier}+=3; # 3 points de plus
#print "<b> 3 pts en plus !</b><br>n";
}
}
# On affecte 2 points en plus par mot-clé trouvé dans le META KEYWORDS de la page.
$buffer=$metakeyword{$fichier};
if ($form{'case'} eq 'Insensitive') { # Si peu importe les majuscules/minuscules.
while ($buffer=~ s/$keyword[$i]/ /i) { # Chaque fois que l'on trouve le mot on le supprime, pour ne pas le compter 2 fois.
$score{$fichier}+=2; # 2 points de plus
#print "<b> 2 pts en plus !</b><br>n";
}
}else {
while ($buffer=~ s/$keyword[$i]/ /) { # Idem, en tenant comptedes majuscules/minuscules
$score{$fichier}+=2; # 2 points de plus
#print "<b> 2 pts en plus !</b><br>n";
}
}
}
#print ("Fichier $fichier, SCORE : $score{$fichier} <br>n" );
}
}
################################################
sub trier {
local ($i,$j);
local ($buffer);
# Algorythme de tri ultra classique, cas d'école :-). Nul besoin de l'optimiser en vitesse ici.
for ($i=0;$i<=$nb_fichier-2;$i++) {
for ($j=$i+1;$j<=$nb_fichier-1;$j++) {
if ( $score{$files[$i]} < $score{$files[$j]} ) { # il faut inverser l'ordre
$buffer=$files[$i];
$files[$i]=$files[$j];
$files[$j]=$buffer;
}
}
}
#for ($i=0;$i<=$nb_fichier-1;$i++) {
# print ("$i : Fichier $files[$i], SCORE : $score{$files[$i]} <br>n" );
#}
}
################################################
sub header {
}
################################################
sub affiche_resultat {
local ($i)=0;
local ($fichier);
local ($res)=0;
print <<;
<br>;
require <http://www.tout-pour-le-bien-etre.com/temp.html>;
print ("<blockquote>" );
print ("<font size="2" face="Arial">n" );
for ($i=$form{'lastnb'}+1;$i<=$form{'lastnb'}+$form{'result_par_page'};$i++) {
## boucle principale d'affichage des résultat
if ($files[$i-1]) {
# on ne génère un affichage que si il y encore à afficher
$fichier=$files[$i-1];
print ("<br><a href="$baseurl$fichier">".$titre{$fichier}."</A>n" );
} else { # plus rien à afficher
if ($res==0) {$res=$i;}
$fini=1;
} # end if
} # end for
print ("</font>n" );
print ("</blockquote>" );
return $res;
}
################################################
################################################
sub formulaire {
}
################################################
sub liens_suite {
local ($lastnb)=$form{'lastnb'}+$form{'result_par_page'};
local ($i,$nb_page)=(0,0);
local ($buffer,$texte,$rec,$suite)=('','','','');
## nb total de pages de réponses ##
$nb_page=($nb_fichier/$form{'result_par_page'});
if (int($nb_page)!=$nb_page) {
$nb_page=int($nb_page)+1;
}
print ("<blockquote><FONT size="2" face="Arial"><b>Pages de résultats : </b>" );
$nb_actuel=$lastnb/$form{'result_par_page'}; # no de page actuel
#print "$nb_actuel <br>n";
## Affichage page précédente
for ($i=1;$i<=$nb_page;$i++) { # un lien pour chaque page
$buffer=$ENV{QUERY_STRING};
if ($form{'lastnb'}) { # on est pas à la page 1
$dummy=$form{'result_par_page'}*($i-1);
$buffer=~ s/&lastnb=$form{'lastnb'}/&lastnb=$dummy/;
}else {
$buffer.='&lastnb='.($form{'result_par_page'}*($i-1));
}
if ($nb_actuel>1 and $i==$nb_actuel-1) { $prec="<a href="$cgiurl?$buffer"><b>[<<Précédent]</b></a>";}
if ($nb_actuel!=$nb_page and $i==$nb_actuel+1) { $suite="<a href="$cgiurl?$buffer"><b>[Suivant>>]</b></a>";}
if ($nb_actuel==$i) {
$texte.="<b>$i</b> "; # pas de lien, pour la page actuelle
}else {
$texte.="<a href="$cgiurl?$buffer">$i</a> ";
}
}
print ("$prec $texte $suite </font></blockquote>" );
}
################################################
sub footer {
}
################################################
sub aide {
print <<;
<html>
<head><title>LE FARFOUINEUR V$version - perl-gratuit.com</title></head>
<body bgcolor="#ffffff" text="#000000" link="#000099" vlink="#663366" alink="#ff0000">
<p align="center"><font size="6"><strong>LE FARFOUINEUR V$version<br>
</strong></font>-- Moteur de recherche de pages web, interne à un site --</p>
<p align="center"><font face="Arial" size="5" color="#000080"><strong><u>Aide - Trucs et
astuces</u></strong></font></p>
<hr width="80%" noshade>
<blockquote>
<ul>
<li><strong><font color="#004080">Aide à l'utilisation :<br>
</font></strong>Dans la case de texte, tapez du texte ou des mots, séparés par des
espaces. Le Farfouineur vous renverra une liste de pages web, contenant les mots que vous
recherchez.</li>
<li><strong><font color="#004080">Classement et score des pages web.<br>
</font></strong>La liste des pages web vous sont renvoyés par ordre décroissant de
pertinence. Les premières pages sont donc celles qui semblent correspondre le mieux à
votre recherche. Le score de chaque page est indiqué, sous sa description.<br>
Le score est calculé de la façon suivante, pour chaque page : 1 point à chaque fois
qu'un mot de recherche est rencontré dans la page, +4 points pour chaque mot présent
dans le titre (title) de la page, +3 points pour chaque mot présent dans la description
(meta name="description", +2 points pour chaque mot rencontré dans les
keywords (meta name="keyword" ou "keywords" ).<br>
Puis les pages sont triés et affichées par ordre décroissant du score.</li>
<li><strong><font color="#004080">Majuscules/minusules :<br>
</font></strong>Si vous sélectionnez "Peu importe", alors une recherche avec
"<strong>maison</strong>", donnera le même résultat qu'avec "<strong>Maison</strong>".<br>
Si vous sélectionnez "Respecter", les résultats seront différents. Cela peut
être utile si vous recherchez une page faisant mention de Monsieur Maison, et non pas
d'une maison </li>
<li><strong><font color="#004080">Rechercher "Tout les mots" :</font></strong> Le
Farfouineur n'affichera que les pages web contenant au moins une fois chacun des mots
contenus dans le texte de recherche.<br>
<strong><font color="#004080">Rechercher "Au moins un des mots" :</font></strong>
Les résultats sont plus larges ... Au moins, vous avez plus de chances d'obtenir des URLs
.</li>
</ul>
<p align="center"><strong><u><font color="#0000A0" size="4">Trucs et astuces.</font></u></strong></p>
<ul>
<li>C'est bien un espace qu'il vous faut mettre entre chaque mots.<br>
</li>
<li>Ne mettez pas de mots inutiles du style <strong>de</strong> , <strong>à</strong> etc.
(mettez <strong>vente maisons luxe Paris</strong>, plutôt que <strong>vente de maisons de
luxe à Paris</strong>, les résultats seront meilleurs.)</li>
</ul>
<p>Vous allez être déçu, le Farfouineur ne prend pas en compte les <strong>+
:</strong> , comme le font d'autres moteurs de recherche comme notre ami
AltaVista. Si néanmoins vous mettez de tels caractères dans la case de texte de
recherche, le Farfouineur les ignore royalement, cela ne le dérange point, et ne génère
pas d'erreur. <br>
</p>
</blockquote>
<hr width="80%" noshade>
<p align="center"><strong><font size="2">Script CGI Perl réalisé par Sébastien Joncheray,
<a href="http://www.perl-gratuit.com">http://www.perl-gratuit.com</a>.</font></strong>
</p>
<center>
<hr width="80%" noshade>
<font face="Arial" size="2">
<a href="$baseurl">Homepage.</a> | <a href="$cgiurl?command=aide">Aide</a> | <a href="$cgiurl">Retour formulaire de recherche</a> <br>
</font>
<br> <br>
</center>
</body>
</html>
}
################################################
################################################
---------------
Xeon