SSI et XSSI

Introduction

Objectifs

Ce petit cours va vous permettre de vous initier à l’utilisation des SSI (Server Side Include). Ces SSI sont des portions de code incluses dans un fichier HTML (dont l’extensions deviendra le plus souvent “.shtml” ou “.sht”).

Le serveur HTTP reconnaissant le fichier, grâce à son extension, comme étant constitué de code SSI, va alors traiter celui-ci afin de constituer le document qui sera effectivement renvoyé au navigateur ayant fait la demande initial. Ce mécanisme permet donc de créer un document HTML différemment selon telles ou telles conditions, mais à partir du même document source.

Inconvénients

Mais il y a un petit inconvénient : si le serveur HTTP doit envoyer un fichier, possédant une extension “.shtml”, il faut alors qu’il scrute ce fichier pour faire les traitements relatifs aux SSI. Il en découle donc un alourdissement de la tache du serveur. Il est donc inutile de donner l’extension “.shtml” à un fichier, s’il n’y en a pas nécessité, cela ne faire que retarder l’envoie du document.

Règles syntaxiques

Comme tous le serveur HTTP ne supporte pas les SSI, il a fallut trouver une syntaxe telle que si le fichier n’est traité par le serveur, le document qui sera visualisé par un navigateur ne devra pas être parasité par le code SSI. Il s’est donc avéré judicieux d’utiliser les commentaires du langage HTML pour introduire les SSI. La syntaxe utilisée est finalement la suivante :

<!–#Commande paramètres–>

Les variables d’environnement

Généralités

Les variables d’environnement servent à faire le lien entre le serveur qui fourni les documents et le navigateur qui l’interroge. Bien que chaque navigateur puisse introduire ses propres variables d’environnement, il en existe un certain nombre que l’on retrouve sur tous les serveurs : le paragraphe suivant en fera un brève description.

Index de quelques variables d’environnement .

DATE_GMT : date et heure GMT (Greenwish Meridian Time) du serveur HTTP.

DATE_LOCAL : date et heure local du serveur.

DOCUMENT_NAME : le nom du fichier sans le chemin d’accès, juste le nom.

DOCUMENT_URI : chemin d’accès du document, sans le nom (sur le serveur, donc débutant par /).

GATEWAY_INTERFACE : version du protocole CGI utilisé.

HTTP_ACCEPT : types MIME supportés par le client.

HTTP_USER_AGENT : carte d’identité du navigateur client.

LAST_MODIFIED : date de la dernière modification du document.

QUERY_STRING : la chaîne de caractères correspondante aux paramètres d’appel du document.

REMOTE_ADDR : l’adresse IP du client.

REMOTE_HOST : le nom de la machine cliente (son numéro IP si n’est pas connu).

SERVER_NAME : le nom de la machine supportant le serveur.

SERVER_PORT : numéro de port du serveur HTTP.

SERVER_PROTOCOL : version du protocole utilisé.

Les valeurs qui suivent sont données à titre d’exemple, et correspondent à l’appel de cette page qui comporte la commande SSI <!–#printenv–> : cette dernière commande affiche simplement les variables d’environnement avec leur valeur.

DOCUMENT_ROOT=/data/perso HTTP_ACCEPT=*/*

HTTP_ACCEPT_ENCODING=gzip, deflate

HTTP_ACCEPT_LANGUAGE=fr

HTTP_CONNECTION=Keep-Alive

HTTP_COOKIE=Apache=193.253.186.171.239811008535540544; DXPERT=1008535558:8ecc9171c7e5f5c82dd8171ecf3d055c; DXPERTSMALL=1008535661:2087eb2c962fa4c4f8120fdd6c563c6e HTTP_HOST=www.multimania.com HTTP_REFERER=http://www.multimania.com/dliard/Sciences/Informatique/Langages/Autres/Ssi/ssi.html HTTP_USER_AGENT=Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) PATH=/bin:/usr/bin:/sbin:/usr/sbin REMOTE_ADDR=193.253.186.171 REMOTE_PORT=61917 SCRIPT_FILENAME=/data/perso/d/l/i/dliard/Sciences/Informatique/Langages/Autres/Ssi/variables.shtml SCRIPT_URI=http://www.multimania.com/dliard/Sciences/Informatique/Langages/Autres/Ssi/variables.shtml SCRIPT_URL=/dliard/Sciences/Informatique/Langages/Autres/Ssi/variables.shtml SERVER_ADDR=213.193.0.216 SERVER_ADMIN=webads@multimania.com SERVER_NAME=www.multimania.com SERVER_PORT=80 SERVER_SIGNATURE=<ADDRESS>Apache/1.3.19 Server at www.multimania.com Port 80</ADDRESS> SERVER_SOFTWARE=Apache/1.3.19 (Unix) mod_fastcgi/2.2.8 GATEWAY_INTERFACE=CGI/1.1 SERVER_PROTOCOL=INCLUDED REQUEST_METHOD=GET QUERY_STRING= REQUEST_URI=/dliard/Sciences/Informatique/Langages/Autres/Ssi/variables.shtml SCRIPT_NAME=/dliard/Sciences/Informatique/Langages/Autres/Ssi/variables.shtml DATE_LOCAL=Thursday, 01-Jan-1970 01:00:00 CET DATE_GMT=Thursday, 01-Jan-1970 00:00:00 GMT LAST_MODIFIED=Tuesday, 29-Aug-2000 09:29:08 CEST DOCUMENT_URI=/dliard/Sciences/Informatique/Langages/Autres/Ssi/variables.shtml DOCUMENT_PATH_INFO= USER_NAME=user#12136 DOCUMENT_NAME=variables.shtml

L’avant dernière commande que nous allons voir, dans ce chapitre, permet d’affecter une valeur à une variable d’environnement. Elle prend deux paramètres : le premier, var, sert à sélectionner la variable qui va se voir affectée de la valeur du second, value.

<!–#set var=”variable” value=”valeur”–>

Enfin, il existe une commande qui permet de mettre dans le document effectivement renvoyé, la valeur d’une des variables d’environnement : il s’agit de la commande <!–#echo –> qui prend un unique paramètre var contenant le nom de la variable dont la valeur est à retourner.

<!–#echo var=”variable” –>

Les structures de contrôle.

Les commandes qui vont être détaillées ci-dessous, servent à contrôler la génération du document : on pourra selon tel ou tel critère choisir les portions de fichier qui devrons être renvoyées ou non.

<!–#break –> : si le serveur HTTP rencontre cette commande, il considère alors que la génération du document final est terminé et il ne traitera pas la suite du fichier.

<!–#goto =”étiquette” –> : cette commande permet de faire continuer la génération du document à l’étiquette (ou label) spécifiée. Pour mieux comprendre regardez l’exemple qui suit.

blablabla <BR>

<!–#goto =”suite” –>

blablabla non renvoyé <BR>

<!–#label =”suite” –>

fin du blablabla

blablabla

[an error occurred while processing this directive] blablabla non renvoyé

[an error occurred while processing this directive] fin du blablabla

<!–#label =”étiquette” –> : cette commande, utilisée en parallèle avec la précédente, permet de définir une étiquette (ou label), comme le montre l’exemple du <!–#goto … –>.


<!–#if expr=”expression” –> … <!–#elif expr=”expression” –> … <!–#else –> … <!–#endif –> : cet ensemble de commandes sert à choisir la partie d’un bloc du document, qui sera effectivement renvoyée au client, selon tel ou tel critère. Pour mieux comprendre cela, regardez l’exemple qui suit : selon le bouton que vous presserez, la marque <BODY> du document renvoyé, verra ses paramètres altérés. Voici le source du document, et les deux boutons.

<HTML>

<HEAD> <TITLE>Exemple</TITLE> </HEAD>

<!–#if expr=”\”$QUERY_STRING\” = \”mode\=blue\”” –>

<BODY BGCOLOR=”#000080″ TEXT=”#0000FF”>

<!–#else –>

<BODY BGCOLOR=”#800000″ TEXT=”#FF0000″>

<!–#endif –>

<FONT SIZE=7><CENTER>Voila le résultat</CENTER>

</BODY>

</HTML>

exemple-if.shtml

appel de “exemple-if.shtml?blue”

appel de “exemple-if.shtml?red”

Vous noterez que les \” sont obligatoires de part et d’autre de chaque opérandes de l’opérateur = d’une l’expression (aussi bien pour un <!–#if expr=”expression” –> que pour un <!–#elif expr=”expression” –>).

Ce genre de manipulation peut donc être utilisée pour réagir (dynamiquement) aux actions du lecteur. On peut de plus cumuler l’utilisation des tests avec celle des sauts pour un contrôle encore plus précis : un saut dans une clause du <!–#if …> ne sera pris en compte que si la clause est vérifiée.

Gestion de fichiers

Les commandes qui vont vous être décrites dans ce chapitre, ont pour but de manipuler des éléments relatifs aux fichiers (qu’il s’agisse du fichier du document ou d’un autre).

<!–#exec cmd|cgi=”fichier” –>

cette commande permet de lancer l’exécution d’un fichier (sur la machine hôte du serveur HTTP, bien entendu). Cependant on peut nuancer les choses de deux manières : tout dépend du fait que l’on veuille récupérer un résultat ou non. Ainsi si vous n’attendez aucun résultat, vous passez comme paramètres cmd=”fichier”, sinon cgi=”fichier” (de manière analogue, un appel de fonction dans un langage quelconque renvoie un résultat, alors que pour l’appel d’une procédure, vous n’en attendez aucun) : le protocole utilisé pour le dialogue étant bien sûr le protocole CGI (Common Gateway Interface).

Pour la suite de ce chapitre, les commandes prendrons comme paramètre soit file=”fichier”, soit virtual=”fichier” selon que l’on spécifie le fichier en question en rapport à la position du document courant (“../../index.html”), ou bien en rapport à la racine du serveur HTTP. Dans ce dernier cas, la localisation commencera forcement par un slash (/) : par exemple “/Graphics/ball.gif” (en admettant que “Graphics” soit un sous-répertoire placé à la racine).

<!–#fsize virtual|file=”fichier” –>

on utilise cette commande afin de mettre dans le document la taille d’un fichier.

La taille du fichier de ce document est de : 6k

<!–#flastmod virtual|file=”fichier” –>

celle-ci est utilisée pour insérer la date de dernière modification du fichier spécifié (et pourquoi pas le document lui même).

Dernière modification : Tuesday, 29-Aug-2000 09:29:03 CEST

Peut-être avez vous remarquez que la date ne coincide pas avec celle marquée en fin de ce chapitre : la raison en est très simple. En effet la date en fin de document correspond à celle ou j’ai tapé, chez moi, les dernières choses : elle est écrite en dure dans le fichier (pas d’utilisation de commande SSI). Mais je n’ai plus poser ce fichier sur le site du serveur que bien après, et c’est cette date là qui est retournée (la copie d’un fichier est en soi une modification de ce dernier), d’ou la différence.

<!–#include virtual|file=”fichier” –>

enfin, cette dernière commande, sert à inclure le code d’un fichier dans celui qui est traité par le serveur. Ceci peut-être fort utile si un certain nombre de document HTML contiennent tous une certaine information à chaque fois identique. Dans ce cas là, il vous suffit d’écrire une fois pour toutes la section considérée dans un fichier que vous inclurez dans tous les autres. Une autre chose bien pratique : si après quelques temps vous décidez de modifier cette section de code, cela sera à faire une fois et une seule (ce qui peut représenter un gain de temps non négligeable).

Exemple d’inclusion d’un fichier comportant une suite de nombres entiers

<!–#include file=”numbers.html” –>

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 …

Les autres commandes

Les commandes qui vont vous être exposées dans ce chapitres ne rentre pas véritablement dans une catégorie précise, d’ou le nom du chapitre. Malgré tout, elles restent très utiles. En voici donc une brève description.

<!–#config … –>

cette commande sert à contrôler, plus ou moins, bien les réactions du serveur HTTP pour la suite du fichier à traIter. Plus précisément, vous contrôlez le format d’affichage de certaines commandes. Voici une brève description des paramètres utilisables par la commande.

errmsg

Ce paramètre sert à fixer la chaîne de caractères introduite dans le document en cas d’erreur dans l’utilisation d’une commande SSI.

Exemple : Erreur dans le code SSI

<!–#config errmsg=”Votre message erreur” –>

sizefmt

Celui-ci détermine le format d’affichage de la taille d’un fichier (commande <!–#fsize file|virtual=”fichier” –>). Les valeurs possibles sont (du moins pour le serveur Apache) bytes (pour une valeur en octets) ou abbrev (qui selon le cas retournera des kilo-octets ou bien des méga-octets).

Exemple : Poid = 11,532 ou Poid = 11k

<!–#config sizefmt=”bytes”–>

<!–#fsize file=”p_ssi2.shtml” –>

ou

<!–#config sizefmt=”abbrev” –>

<!–#fsize file=”p_ssi2.shtml” –>

timefmt

Nous avons vue comment afficher la date avec la commande flastmod mais il serait agréable de pouvoir changer son format d’affichage. En utilisant la commande config et son attribut timefmt avant la commande flastmod, il est possible de varier le format de la date.

<!–#config timefmt=”Tout groupement valide de codes de formatage”–>

Code

Signification

%a

Jour de la semaine abrégé, défini localement

%A

Jour de la semaine complet, défini localement

%b

Nom du mois abrégé, défini localement

%B

Nom du mois complet, défini localement

%c

Représentation de la date et de l’heure préférée localement

%d

Jour du mois sous forme de décimal (entre 01 et 31)

%m

Mois sous forme de décimal (entre 01 et 12)

%U

Numéro de la semaine de l’année courante, sous forme de décimal, en prenant le premier dimanche de l’année comme début de la première semaine.

%W

Numéro de la semaine de l’année courante, sous forme de décimal, en prenant le premier lundi de l’année comme début de la première semaine.

%w

Jour de la semaine sous forme de décimal, dimanche étant égal à 0

%x

Représentation de la date préférée localement, sans mention de l’heure

%y

Année sous forme de décimal, sans mention du siècle (entre 00 et 99)

%Y

Année sous forme de décimal, siècle compris

%H

L’heure sous forme de décimal, en utilisant un format 24 heures (entre 00 et 23)

%I

L’heure sous forme de décimal, en utilisant un format 14 heures (entre 00 et 11)

%j

Jour de l’année sous forme de décimal (entre 001 et 366)

%M

Minute sous forme de décimal

%p

a.m. (du matin) ou p.m. (de l’après midi), selon la valeur de l’heure ou les chaînes définies localement

%S

Seconde sous forme de décimal

%X

Représentation du temps préférée localement, sans mention de la date

%Z

Fuseau horaire, nom ou abréviation

Exemple en chiffre : 16-10-99

<!–#config timefmt=”%d-%m-%y” –>

<!–#flastmod file=”p_ssi3.shtml” –>

Exemple standart : 16-October, 99

<!–#config timefmt=”%d-%B, %y” –>

<!–#flastmod file=”p_ssi3.shtml” –>

Notez que la commande configuration de format de la date est selon votre serveur en français ou en anglais.

Attention aux espaces et aux majuscules/minuscules… Il ne doit pas avoir d’espace entre les symboles de la remarque et la commande config et il doit en avoir une avant la fermeture de la remarque et n’oubliez pas que les commandes SSI font la différence entre les majuscules et les minuscules, Config n’est pas config… Évidemment le nom des jours ou des mois définie localement sur votre serveur demande une autorisation pour être modifiés. Comme lundi, mardi… souvent en anglais.

<!–#email … –> : cette dernière commande permet d’envoyer un courrier électronique lorsque le document est sollicité au serveur HTTP (certains serveurs acceptants les SSI ne supportent malheureusement pas cette commande). Les paramètres dont la description suit, sont obligatoires.

fromhost :

tohost :

fromaddress :

toaddress :

Les paramètres qui suivent ne sont pas obligatoires.

message : c’est le message à envoyer.

subject : le sujet de ce courrier électronique.

cc : fixe le champs CC

Les XSSI

Les XSSI (eXtended Server Side Include) ont été introduits pour combler certaines lacunes des SSI. L’esprit reste toujours de faire un langage de script minimum, mais la syntaxe a été rendue plus flexible (gestion des expressions rationnelles et des variables), la commande if a été modifiée pour être plus naturelle, et la commande printenv a été ajoutée.

La syntaxe

Les XSSI permettent d’utiliser des expressions régulières et des variables au sein des chaînes de caractères. Cet ajout rend ce langage beaucoup plus puissant.

<!– #COMMANDE PARAM=”$VARIABLE” –>

Ou encore :

<!– #COMMANDE PARAM=”blabla${VARIABLE}blabla” –>

On peut utiliser les expressions régulières habituelles sous Unix. Je ne détaillerais pas la syntaxe des expressions rationnelles dans ce document. À propos des expressions rationnelles, je vous conseille fortement la lecture de la page manuel de la commande egrep (man egrep) ou de sh (man sh).

Par exemple :

<!–#if expr=”\”${SERVER_NAME}\” = /.*\.linux-france\.fr/” –>

S’exécute seulement si le serveur qui l’a contacté a une adresse qui se finit en “.linux-france.fr”.

On peut, de plus, faire des affectations de valeur à une variable :

<!–#set var=”VARIABLE” value=”VALEUR”–>

Par exemple :

<!–#set var=”DOCUMENT_NAME” value=”Ma PageWeb”–>

À partir de cette balise, la variable DOCUMENT_NAME contiendra la chaîne de caractères Ma PageWeb.

Les commandes

La commande printenv est ajouté et la syntaxe if est plus naturelle.

printenv

Écrit la liste de toutes les variables existantes et leur valeurs.

if, elif, else, endif

Ces commandes permettent d’effectuer une exécution sous certaines conditions. La syntaxe se rapproche beaucoup de celle de la programmation classique :

<!–#if expr=”TEST1″ –>

CODE HTML 1

<!–#elif expr=”TEST2″ –>

CODE HTML 2

<!–#else –>

CODE HTML 3

<!–#endif –>

Si TEST1 est vrai, c’est CODE HTML 1 qui sera executé. Si TEST1 est faux et TEST2 est vrai, c’est CODE HTML 2 qui sera executé. Enfin, si ni TEST1, ni TEST2 ne sont vrai, c’est CODE HTML 3 qui sera executé. Les TEST sont des comparaisons de chaînes de caractères (on peut utiliser les expressions régulières). Voici un rapide survol des possibilités :

string

Vrai si string est non vide,

string1 = string2

Teste l’égalité des chaînes de caractères,

string1 != string2

Teste la différence des chaînes de caractères,

(test)

Test si test est vrai,

!test

Teste la négation de test,

test1 && test2

Teste la conjonction de test1 et test2 (ET logique),

test1 || test2

Teste si l’un des deux est vrai (OU logique).

Exemple :

<!–#if expr=”REMOTE_ADDR != 197\.1??\.17\.2″–>

<A href=”secret-link.html”>Lien secret</A>

<!–#endif –>

0.00 avg. rating (0% score) - 0 votes