SELFHTML

Patrick Andrieu:
Server Side Includes avec le serveur Web Xitami

Page d'information: vue d'ensemble

vers le bas L'auteur
vers le bas Remarques sur le sujet
vers le bas Le fichier 'perlssi'
vers le bas Modifications du code du fichier 'perlssi'
vers le bas Le fichier-test
vers le bas Liens contextuels

vers le bas 

Patrick Andrieu

E-Mail: adresse électonique patricka@selfhtml.org
Homepage-URL: Page en langue allemande http://www.atomic-eggs.com/

Veuillez adresser vos questions relatives à cet article uniquement à son auteur.

vers le hautvers le bas 

Remarques sur le sujet

Pour celui qui n'est pas issu directement du milieu des „programmeurs“ et qui n'a donc aucune expérience des langages de programmation, le parcours est connu: tout d'abord c'est l'apprentissage de HTML grâce à SELFHTML, ensuite vient un peu de JavaScript, puis les premiers résultats sont mis en ligne, la présence s'accroît et il faut bientôt en venir aux solutions côté serveur. C'est donc également Perl ou PHP qui sont „étudiés“. Étant donné que le transfert continuel des scripts Perl aux fins de test devient vite contraignant, la solution d'un serveur Web local pouvant être installé et configuré sur son propre ordinateur Windows s'impose rapidement.

Il n'existe à vrai dire qu'un seul serveur Web digne de ce nom, et c'est Apache. Cependant, étant donné la multitude de possibilités de configuration qu'offre ce serveur Web, l'apprentissage s'avère difficile pour des véritables néophytes. Par chance pour ces derniers, il existe aussi un logiciel que beaucoup appellent « le petit serveur Web »: le vers le bas Xitami. Son installation et sa configuration sont relativement simples et il est à pied d'œuvre en un instant. On appelle vite son navigateur, on entre http://localhost/ dans la ligne d'adresse, et déjà sa propre page d'accueil peut être consultée dans un environnement HTTP, comme si elle se trouvait sur un serveur extérieur, livrée sur un plateau, pardon, sur l'écran! Il est ainsi possible de tester ses propres scripts jusqu'à ce qu'ils soient impeccables et mûrs pour leur mise en œuvre en ligne!

Celui qui toutefois mise sur les Server Side Includes (SSI) est rapidement confronté aux limites du « petit serveur Web », comme le montre cette question récurrente trouvée relativement souvent dans les Page en langue allemandePage d'information: connexion exigée archives du forum SELFHTML allemand. En effet, le serveur Web Xitami ne manie pas les Server Side Includes! Si l'on se réfère à la documentation et aux questions récurrentes qui l'accompagnent, on peut y lire les choses suivantes:

Xitami provides a standard SSI filter (PerlSSI) which requires a Perl interpreter. This is not meant for heavy-duty work, but is a good example of a filter. (We intend to develop a fast SSI module that will be embedded into the server directly.)

et plus loin:

SSI (server-side includes) is a fairly standard syntax which you can read about on the NCSA site. We implemented all the common SSI tags in the PerlSSI filter. To use this, you need Perl on your system (it should be on the PATH). The PerlSSI filter is slow, and meant as a work-around until we implement SSI the correct way, in the server itself. The PerlSSI filter is located in the Xitami directory itself. To run it, you must have Perl installed. The requirements for this filter are the same as for a Perl CGI program.

En clair (et en français), cela signifie que les SSI ne sont pas encore implémentés dans le serveur Web Xitami mais qu'ils y sont incorporés grâce à un filtre nommé PerlSSI. Le fichier perlssi fait partie des fichiers copiés à l'installation du Xitami et se trouve après installation dans le répertoire Xitami (C:\Xitami ou C:\xitami-25\app pour la version 2.5). Toutefois, ce fichier est écrit de façon si générale qu'en raison de l'organisation individuelle de chacun sur son propre ordinateur, la représentation des SSI sur son serveur local sans avoir adapté le code du fichier ne réussit que rarement au pied levé...

Vous apprendrez dans les sections qui suivent comment, avec un minimum de modifications du code Perl du fichier perlssi, amener votre serveur Web Xitami à afficher correctement les SSI dans vos pages Web. Enfin, un fichier avec quelques instructions SSI sera présenté pour des tests concluants.

vers le hautvers le bas 

Le fichier perlssi

Démonstration - nouvelle fenêtre Fichier perlssi

Remarque:

Pour que vous vous repèriez plus facilement dans le fichier, un numéro a été affecté à chaque ligne. Vous pouvez donc, après avoir auparavant sauvegardé votre perlssi original dans un autre répertoire, ouvrir la copie à modifier dans un éditeur de texte. Vous devriez utiliser ici un éditeur de texte permettant d'empêcher le passage à la ligne automatique (de façon à ce que la numérotation des lignes soit respectée et que celles-ci ne soient pas scindées). Dans les vers le bas Liens contextuels vous trouverez l'adresse de EditPad Lite: Cet éditeur présente cette propriété et il est également possible de rechercher des lignes directement d'après leur numéro. Il existe naturellement d'autres éditeurs qui offrent ces deux possibilités!

Attention:

Cet article s'adresse avant tout à des débutants et n'avait donc pas comme objectif prioritaire d'expliciter tout le code du fichier perlssi. Il vise davantage à attirer l'attention sur les passages du code devant être modifiés pour une incorporation parfaite des SSI dans le serveur Web Xitami. Pour ce faire, un minimum de connaissances en Perl est requis, et des termes tels que par exemple Page d'information: connexion exigée ligne "Shebang", Page d'information: connexion exigée sous-routines ainsi que leur appel respectif, ne doivent pas être inconnus... De plus, il vous faut avoir lu et assimilé le chapitre SELFHTML sur les Page d'information: connexion exigée Server Side Includes.

vers le hautvers le bas 

Modifications du code du fichier perlssi

Avant tout, assurez-vous que dans le fichier defaults.cfg du répertoire Xitami ou xitami-25\app (version 2.5) figure la mention suivante:

[Filter]
    Shtml=perlssi

La mention devrait en principe déjà y figurer et assure l'accès au filtre PerlSSI pour les fichiers avec l'extension .shtml.

La configuration qui suit sert de point de départ pour les modifications ci-après du fichier perlssi:

Une autre configuration personnelle exige une adaptation en conséquence des modifications décrites. Généralement, il est toutefois avantageux d'observer dans son répertoire Web local exactement la même structure que celle existant sur le serveur de votre fournisseur d'accès. Ce n'est qu'ainsi qu'il est possible par exemple de travailler sur le serveur local avec des chemins absolus et les adaptations pour le test des scripts Perl ne se limitent alors qu'aux chemins présentant localement un autre aspect: par exemple, une variable $dossier doit donc se voir affecter la valeur "D:\\www\\dossier" pour le script Perl testé en local, tandis que le script en ligne doit contenir l'instruction $dossier = "/public_html/dossier"; ou quelque chose d'analogue.

Tout d'abord, les variables déclarées au début du script (lignes 32 à 36) sont vérifiées:

$BINDIR  = $ENV {CGI_ROOT};         #   emplacement des programmes CGI
$BINURL  = $ENV {CGI_URL};          #   préfixe URL CGI
$DOCROOT = $ENV {DOCUMENT_ROOT};    #   emplacement des pages Web
$DOCPATH = $ENV {PATH_TRANSLATED};  #   racine du document, coupée avant '/'
$DOCPATH = $1 if $DOCPATH =~ /(.*)\//;

Placez en commentaire la ligne 33 en entrant au début de la ligne un signe dièse # suivi, pour faciliter la lecture, d'un espace:

$BINDIR  = $ENV {CGI_ROOT};         #   emplacement des programmes CGI
# $BINURL  = $ENV {CGI_URL};        #   préfixe URL CGI
$DOCROOT = $ENV {DOCUMENT_ROOT};    #   emplacement des pages Web
$DOCPATH = $ENV {PATH_TRANSLATED};  #   racine du document, coupée avant '/'
$DOCPATH = $1 if $DOCPATH =~ /(.*)\//;

Explication:

Les Page d'information: connexion exigée variables d'environnement $ENV {...}, notées ici comme affectation de valeur, dépendent de la configuration du serveur Xitami. Ainsi, $ENV {CGI_ROOT} est le chemin à votre répertoire cgi-bin (D:\www\cgi-bin), et $ENV {DOCUMENT_ROOT} le chemin à votre dossier Web www (D:\www). La variable d'environnement $ENV {CGI_URL} est vide, si à la configuration de votre serveur Xitami vous avez laissé le champ correspondant CGI URLs start with: en blanc (voir illustration ci-dessous: si vous aviez déjà noté quelque chose ici, vous pouvez l'effacer maintenant). C'est pour cette raison que la variable $BINURL n'est pas nécessaire et que la ligne 33 a été placée en commentaire.

Page de configuration du serveur Web Xitami
Page de configuration du serveur Web Xitami - Le champ CGI URLs start with: reste en blanc.

Ensuite, c'est la ligne 69 qui est placée en commentaire. Il s'est avéré que l'appel de la sous-routine MakePathname est à cet endroit superflu, étant donné que l'appel "significatif" de cette sous-routine a lieu à un autre endroit (ligne 147):

$infile = $sent;
# &MakePathname;
$target = $outfile;

L'étape suivante traite de cette même sous-routine MakePathname, qui est définie aux lignes 244-266:

sub MakePathname {
    $errno = 1;
    $info = $infile;
    if ($info =~ /^$BINURL\//) {
        @split1 = split (/$BINURL\//, $info);
        $info = join ('/', $BINDIR, $split1 [1]);
    }
    else {
        $info = $DOCROOT.$info;
    }
    $outfile = $info;
    if (!-e $outfile) {
        print "<P>File not found: $outfile";
        &GiveErrMsg;
    }
    else {
        $errno = 0;
    }
}

Vous souvenez-vous? Notre première étape fut de placer en commentaire la ligne 33 ($BINURL = $ENV {CGI_URL};). La variable $BINURL n'existe donc plus. C'est pourquoi les instructions des lignes 247 à 249 sont sans effet. Remplacez ces trois lignes par les trois suivantes:

    if ($info =~ /^\/cgi-bin/) {
       $info =~ s/\/cgi-bin//g;
       $info = $BINDIR.$info;

Explication:

Il est vérifié ici dans l'instruction if si la variable $info commence par la chaîne de caractères /cgi-bin. Si c'est le cas, cette chaîne de caractères est effacée (remplacée par rien): $info =~ s/\/cgi-bin//g;. Enfin une nouvelle valeur est affectée à la variable $info: elle se compose de la valeur de $BINDIR et de la valeur actuelle de $info (qui vient d'être libérée de la chaîne de caractères /cgi-bin) par concaténation de chaînes de caractères. À cet endroit, si vous voulez afficher la sortie d'un script nommé script.pl au moyen des SSI, la variable $info aura la valeur D:\www\cgi-bin plus /script.pl = D:\www\cgi-bin/script.pl. Plus loin, cette valeur est affectée à la variable $outfile: $outfile = $info; (ligne 254). Comment rectifier le mélange de barres obliques et de barres obliques inverses fait l'objet des prochaines explications. Et voici la sous-routine modifiée MakePathname au complet:

sub MakePathname {
    $errno = 1;
    $info = $infile;
    if ($info =~ /^\/cgi-bin/) {
       $info =~ s/\/cgi-bin//g;
       $info = $BINDIR.$info;
    }
    else {
        $info = $DOCROOT.$info;
    }
    $outfile = $info;
    if (!-e $outfile) {
        print "<P>File not found: $outfile";
        &GiveErrMsg;
    }
    else {
        $errno = 0;
    }
}

Attaquons-nous maintenant à la sous-routine la plus importante - pour ainsi dire la routine centrale - du script perlssi: HandleSSI. Celle-ci commence à la ligne 98, se termine à la ligne 242 et se divise en six sections. Les sections sont des embranchements if ou bien elsif, et chacun d'eux figure pour une instruction SSI. Ainsi la première section à partir de la ligne 99 traite l'instruction SSI #config: if ($ssi =~ /^config/i). À partir de la ligne 117 l'instruction SSI #echo est traitée dans un embranchement elsif, à partir de la ligne 143 l'instruction #exec, valable pour les fichiers exécutables ou les programmes/scripts, à partir de la ligne 200 l'instruction SSI #include. À partir de la ligne 212, c'est le tour de l'instruction SSI pour l'affichage de la date de la dernière modification d'un fichier #flastmod et enfin à partir de la ligne 222, l'instruction SSI #fsize pour l'affichage de la taille d'un fichier.

La modification à entreprendre ensuite concerne uniquement le traitement de l'instruction #exec, et nous porterons donc notre attention sur les lignes 143 à 199. Étant donné qu'une seule modification ou qu'un seul complément n'est finalement nécessaire, l'encart ci-après se limitera à l'affichage des lignes 143 à 168:

    elsif ($ssi =~ /^exec/i) {
        if ($ssi =~ /cgi="([^"?]+)(\??([^"]*))"/i) {
            $infile = $1;
            $args   = $3;
            &MakePathname;
            $var = $outfile;
            if ($errno == 0) {
                #   Nous pouvons maintenant exécuter le script CGI dans $var
                $ENV {"QUERY_STRING"} = $3;

                #   Traiter d'abord les systèmes MS-DOS
                if (defined ($ENV {"COMSPEC"})) {
                    $var =~ s/\//\\/g;
                    #   Essayer d'abord des programmes exécutables normaux
                    if ($var =~ /\.exe$|\.com$|\.bat$/i) {
                        $_ = `$var $args`;
                    }
                    else {
                        #   Vérifier l'entête de fichier por voir s'il s'agit d'un script
                        #   Nous recherchons '#! xxxx' ou '/*! xxxx'
                        open (FOO, $var);
                        $_ = <FOO>;
                        chop;
                        close (FOO);

                        if (/^\#\!\s*(.+)|^\/\*\!\s*([^*]+)\*\//) {

Explication:

Dans l'embranchement elsif, il est tout d'abord vérifié s'il s'agit ici d'une instruction #exec: elsif ($ssi =~ /^exec/i). La variable $ssi est déclarée plus haut dans le code de perlssi (ligne 81) et sa valeur correspond à l'instruction SSI actuelle sans le signe dièse qui précède. Si donc l'instruction <!--#exec cgi="/cgi-bin/script.pl"--> a été notée dans le fichier .shtml, la variable $ssi a pour valeur exec cgi="/cgi-bin/script.pl".

Dans l'embranchement if qui suit (ligne 144), le chemin absolu du script à incorporer avec #exec est extrait à l'aide d'une Page d'information: connexion exigée expression régulière, donc dans notre exemple: /cgi-bin/script.pl. Cette valeur est affectée dans la ligne 145 à la variable $infile. Enfin intervient l'appel (ligne 147) de la sous-routine MakePathname commentée plus haut, et dans laquelle la variable $outfile reçoit une valeur qui correspond au chemin complet du script à traiter. Ce chemin contient cependant - on l'a vu plus haut - tant des barres obliques que des barres obliques inverses.

Cela sera pris en compte ligne 155. Après que la valeur de $outfile a été transmise ligne 148 à une autre variable $var ($var = $outfile;), toutes les barres obliques trouvées éventuellement dans la chaîne de caractères sont remplacées ici par des barres obliques inverses: $var =~ s/\//\\/g;. Après quoi le chemin de notre exemple est à nouveau correct: D:\www\cgi-bin\script.pl

Le complément annoncé dans cette partie du script sert finalement à vous épargner bien du travail lorsque vous testez des scripts incorporés avec l'instruction SSI #exec cgi. En l'absence de la ligne qui suit, il vous faudrait noter, pour vos tests locaux, la ligne Shebang (la toute première ligne d'un script Perl) de la façon suivante: #!c:/Perl/bin/Perl.exe. Avant le transfert sur le serveur de votre fournisseur d'accès, vous devriez ensuite modifier celle-ci de la façon suivante: #!/usr/bin/perl - faute de quoi vous recevriez à coup sûr une "erreur 500" (« Internal Server Error »)!

Notez donc ligne 167, qui est bien vide, l'instruction suivante:

                        $_ =~ s/^\#\!\/usr\/bin\/perl/\#\!c\:\/Perl\/bin\/perl\.exe/g;

Explication:

Maintenant, perlssi vous décharge de ce travail! L'instruction ci-dessus fait en sorte que dans le script, ouvert en lecture ligne 163 (open (FOO, $var);) et dont le contenu est copié ligne par ligne dans la Page d'information: connexion exigée scalaire prédéfinie $_ , la chaîne de caractères #!/usr/bin/perl y est recherchée pour être remplacée par #!c:/Perl/bin/Perl.exe. Plus besoin donc lors de vos tests de vous soucier de la ligne shebang!

Ainsi toutes les modifications et suppléments ont été faits dans le fichier perlssi! En avant pour les tests!

Remarque:

Il vous est également possible maintenant de remplacer les messages d'erreurs sortis en anglais, quand par exemple une variable n'est pas reconnue, un fichier n'est pas trouvé ou autres erreurs similaires, par des textes français. Ci-après deux exemples comme vous les trouvez ligne 139 (print "<P>Unrecognised #echo variable: $var";) et ligne 172 (print "<P>Cannot execute $var";):

            print "<p>Variable #echo inconnue: $var";
.
.
.
                            print "<p>$var ne peut pas être exécuté!";

Vous trouverez ici le code complet et modifié du fichier perlssi sans numéros de ligne (prêt à être copié, collé, enegistré): Démonstration - nouvelle fenêtre fichier perlssi modifié

vers le hautvers le bas

Le fichier-test

Démonstration - nouvelle fenêtre Fichier ssi_test.shtml

Explication:

Le présent fichier-test ssi_test.shtml comprend six parties. Dans chaque partie est expliquée une instruction SSI différente. Vous avez cependant besoin de quatre autres fichiers: deux fichiers texte pour les instructions SSI #fsize, #flastmod et #include et deux scripts Perl pour l'instruction #exec. Vous pouvez bien entendu vous inspirer des exemples qui suivent ou bien les reprendre. Le fichier ssi_test.shtml proprement-dit peut être copié directement dans votre dossier Web: D:\www\ssi_test.shtml.

Fichiers texte:

Constituez deux fichiers texte avec peu de contenu, par exemple Ce sont les nouvelles qui viennent en premier! et Et ce sont les nouvelles qui viennent en second!, et enregistrez les dans un répertoire à créer éventuellement D:\www\nouvelles. Donnez aux fichiers les noms de nouvelle1.txt et nouvelle2.txt.

Scripts Perl:

Écrivez deux scripts Perl pour une sortie simple, par exemple un script nommé script1.pl (Hello le monde) et un deuxième script script2.pl (Encore une fois hello, le monde), que vous enregistrez dans votre répertoire cgi-bin (D:\www\cgi-bin). Exemple script1.pl:

#!/usr/bin/perl

print "Hello le monde\n";

De plus amples explications sur ce que vous devez voir ou ne pas voir ici se trouvent directement dans le Démonstration - nouvelle fenêtre fichier ssi_test.shtml.

vers le hautvers le bas

Liens contextuels

Les adresses qui suivent sont recommandées pour mieux comprendre les exemples ci-dessus ou pour approfondir et apprendre d'autres possiblités.

Page d'information: connexion exigée SELFHTML: Server Side Includes
Page d'information: connexion exigée SELFHTML: CGI/Perl
englischsprachige Seite NCSA: Server Side Includes
englischsprachige Seite W3C: Server Side Includes commands
englischsprachige Seite Xitami-Webserver
englischsprachige Seite EditPad Lite

vers le haut

© 2005 Seite Informations