Serveur Apache HTTP Version 2.4
Les SSI permettent d'ajouter du contenu dynamique � des documents HTML pr�existants.
Modules Apparent�s | Directives Apparent�es |
---|---|
Cet article traite des Inclusions C�t� Serveur (Server Side Includes), plus commun�ment appel�s SSI. Vous trouverez ici la mani�re de configurer votre serveur pour permettre les SSI, ainsi qu'une introduction � quelques techniques SSI de base permettant d'ajouter du contenu dynamique � vos pages HTML pr�existantes.
La derni�re partie de cet article sera consacr�e aux configurations SSI plus avanc�es, telles que les expressions conditionnelles dans les directives SSI.
SSI (Server Side Includes) est constitu� de directives plac�es dans des pages HTML, et �valu�es par le serveur au moment o� les pages sont servies. Elles vous permettent d'ajouter du contenu g�n�r� dynamiquement � une page HTML pr�existante, sans avoir � servir la page enti�re via un programme CGI, ou toute autre technologie de contenu dynamique.
Par exemple, vous pouvez ins�rer la directive suivante dans une page HTML existante :
<!--#echo var="DATE_LOCAL" -->
Ainsi, lorsque la page sera servie, la directive sera �valu�e et remplac�e par sa valeur :
Tuesday, 15-Jan-2013 19:28:54 EST
Le choix entre l'utilisation des SSI et la g�n�ration enti�re de la page par un programme quelconque, est en g�n�ral dict� par la proportion de contenu statique et de contenu devant �tre g�n�r� chaque fois que la page est servie. SSI est id�al pour ajouter de petites quantit�s d'information, comme l'heure courante dans l'exemple pr�c�dent. Mais si la plus grande partie de votre page est g�n�r�e au moment o� elle est servie, vous devez vous tourner vers une autre solution.
Pour permettre l'utilisation des SSI sur votre serveur, vous
devez ajouter la directive suivante dans votre fichier
apache2.conf
, ou dans un fichier .htaccess
:
Options +Includes
Cette directive indique � Apache que vous d�sirez permettre la
recherche de directives SSI lors de l'interpr�tation des fichiers.
Notez cependant que la plupart des configurations contiennent de
nombreuses directives Options
qui peuvent s'�craser les unes les autres. Vous devrez probablement
appliquer ces directives Options
au r�pertoire
sp�cifique pour lequel vous voulez activer les SSI, afin d'�tre s�r
qu'elles y seront bien activ�es.
Tout fichier ne fera cependant pas l'objet de recherche de
directives SSI. Vous devez indiquer � Apache quels fichiers seront
concern�s. Vous pouvez y parvenir en indiquant une extension, comme
.shtml
, � l'aide des directives suivantes :
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
Un des d�savantages de cette approche r�side dans le fait que si
vous voulez ajouter des directives SSI � une page pr�existante, vous
devrez changer le nom de cette page, et donc tout lien qui la
contient, de fa�on � ce qu'elle poss�de l'extension
.shtml
, condition n�cessaire pour que les directives
SSI qu'elle contient soient trait�es.
Une autre m�thode consiste � utiliser la directive XBitHack
:
XBitHack on
La directive XBitHack
indique � Apache qu'il doit rechercher des directivves SSI dans les
fichiers si leur bit d'ex�cution est positionn�. Il n'est ainsi plus
n�cessaire de changer le nom du fichier pour ajouter des directives
SSI � une page pr�existante ; vous devez simplement attribuer les
droits d'ex�cution au fichier � l'aide de chmod
.
chmod +x pagename.html
Un bref commentaire sur ce qu'il ne faut pas faire. Certaines
personnes peuvent vous conseiller de tout simplement indiquer �
Apache de rechercher des directives SSI dans tous les fichiers
.html
, ce qui vous �vite d'avoir � g�rer les noms de
fichiers avec extension .shtml
. Ils n'ont probablement
pas entendu parler de la directive XBitHack
. En effet, vous devez
garder � l'esprit qu'en faisant ceci, Apache va devoir rechercher
des directives SSI dans chaque fichier qu'il sert, m�me s'il n'en
contient aucune. Ce n'est donc pas une bonne id�e car les
performances peuvent en �tre sensiblement affect�es.
Bien entendu, sous Windows, il n'y a pas de bit d'ex�cution � positionner, ce qui limite un peu vos choix.
Dans sa configuration par d�faut, Apache n'envoie pas la date de derni�re modification ou les en-t�tes HTTP relatifs � la taille des contenus dans les pages SSI, car ses valeurs sont difficiles � calculer pour les contenus dynamiques. Ceci peut induire une impression de diminution des performances c�t� client, en emp�chant la mise en cache de votre document. Il existe deux m�thodes pour r�soudre ce probl�me :
XBitHack Full
. Elle
indique � Apache de d�terminer la date de derni�re modification en
ne regardant que la date du fichier � l'origine de la requ�te,
tout en ignorant la date de modification de tout fichier inclus.mod_expires
pour d�finir de mani�re explicite la
date d'expiration de vos fichiers, laissant par la-m�me
aux navigateurs et aux mandataires le soin de d�terminer s'il est
opportun ou non de les mettre en cache.Les directives SSI adoptent la syntaxe suivante :
<!--#fonction attribut=valeur attribut=valeur ... -->
Le format d'une directive SSI �tant similaire � celui d'un commentaire HTML, si vous n'avez pas activ� correctement SSI, le navigateur l'ignorera, mais elle sera encore visible dans le source HTML. Si SSI est correctement configur�, la directive sera remplac�e par ses r�sultats.
"fonction" peut prendre de nombreuses formes, et nous d�crirons plus pr�cis�ment la plupart d'entre eux dans la prochaine version de ce document. Pour le moment, voici quelques exemples de ce que vous pouvez faire avec SSI.
<!--#echo var="DATE_LOCAL" -->
La fonction echo
permet d'afficher la valeur d'une
variable. Il existe un grand nombre de variables standards, y
compris l'ensemble des variables d'environnement disponibles pour
les programmes CGI. De plus, vous pouvez d�finir vos propres
variables � l'aide de la fonction set
.
Si vous n'aimez pas le format sous lequel la date s'affiche, vous
pouvez utiliser la fonction config
avec un attribut
timefmt
, pour le modifier.
<!--#config timefmt="%A %B %d, %Y" -->
Today is <!--#echo var="DATE_LOCAL" -->
Derni�re modification du document <!--#flastmod file="index.html" -->
Le format peut l� aussi �tre modifi� � l'aide de l'attribut
timefmt
.
C'est le cas le plus courant d'utilisation des SSI - afficher les r�sultats d'un programme CGI, comme l'universellement ador� "compteur d'acc�s".
<!--#include virtual="/cgi-bin/counter.pl" -->
Vous trouverez dans ce qui suit quelques exemples sp�cifiques de ce que vous pouvez faire de vos documents HTML avec SSI.
Nous avons mentionn� plus haut que vous pouviez utiliser SSI pour informer l'utilisateur de la date de derni�re modification du document. Cependant, la m�thode pour y parvenir n'a pas �t� vraiment abord�e. Plac� dans votre document HTML, le code suivant va ins�rer un rep�re de temps dans votre page. Bien entendu, SSI devra avoir �t� correctement activ�, comme d�crit plus haut.
<!--#config timefmt="%A %B %d, %Y" -->
Derni�re modification du fichier <!--#flastmod file="ssi.shtml" -->
Bien entendu, vous devez remplacer ssi.shtml
par le
nom du fichier auquel vous faites r�f�rence. Ceci ne conviendra pas
si vous recherchez un morceau de code g�n�rique que vous pourrez
ins�rer dans tout fichier ; dans ce cas, il est pr�f�rable
d'utiliser la variable LAST_MODIFIED
:
<!--#config timefmt="%D" -->
This file last modified <!--#echo var="LAST_MODIFIED" -->
Pour plus de d�tails sur le format timefmt
, tapez
strftime
dans votre moteur de recherche pr�fer�. La
syntaxe est identique.
Si le site que vous g�rez comporte plus que quelques pages, vous allez vite vous apercevoir qu'effectuer des modifications sur toutes ces pages peut devenir tr�s contraignant, en particulier si vous voulez qu'elles conservent un aspect homog�ne.
Inclure un fichier pour un en-t�te et/ou un pied de page peut
simplifier cette corv�e de mises � jour. Il vous suffit de
confectionner un fichier de pied de page, et de l'inclure dans
chaque page � l'aide de l'�l�ment SSI include
. Pour
d�finir le fichier � inclure, la fonction include
peut
utiliser soit l'attribut file
, soit l'attribut
virtual
. L'attribut file
est un chemin de
fichier relatif au r�pertoire courant. C'est � dire qu'il
ne peut ni avoir pour valeur un chemin absolu (commen�ant par /), ni
comporter "../" dans son chemin. L'attribut virtual
est
probablement plus commode, et peut sp�cifier une URL relative au
document servi. Elle peut commencer par un /, mais le fichier inclus
et le fichier servi doivent r�sider sur le m�me serveur.
<!--#include virtual="/footer.html" -->
Je combinerai souvent ces deux derniers points, en ajoutant une
directive LAST_MODIFIED
dans un fichier de pied de page
destin� � �tre inclus. Le fichier inclus peut contenir des
directives SSI, et les inclusions peuvent �tre imbriqu�es - �
savoir, le fichier inclus peut inclure un autre fichier, etc...
En plus du format de date, vous pouvez utiliser l'�l�ment
config
pour configurer deux autres choses.
En g�n�ral, lorsque quelque chose se passe mal avec votre directive SSI, vous recevez le message :
[an error occurred while processing this directive]
Pour modifier ce message, vous pouvez utiliser l'attribut
errmsg
avec la fonction config
:
<!--#config errmsg="[Il semblerait que vous ne sachiez pas
utiliser les SSI]" -->
Il est cependant probable que les utilisateurs finaux ne voient jamais ce message, car vous aurez r�solu tous les probl�mes issus de vos directives SSI avant que votre site ne soit mis en production. (N'est-ce pas ?)
Vous pouvez aussi modifier le format sous lequel les tailles de
fichiers sont affich�es � l'aide de l'attribut sizefmt
.
Vous pouvez sp�cifier bytes
pour un affichage en
octets, ou abbrev
pour un affichage plus concis en Ko
ou Mo, selon le cas.
J'ai pour projet, dans les prochains mois, d'�crire un article �
propos de l'utilisation des SSI avec des petits programmes CGI. Pour
l'instant, voici ce que vous pouvez faire avec la fonction
exec
. Vous pouvez vraiment faire ex�cuter une commande
par SSI en utilisant le shell (/bin/sh
, pour �tre plus
pr�cis - ou le shell DOS, si vous �tes sous Win32). Par exemple, ce
qui suit vous permet d'afficher le contenu d'un r�pertoire.
<pre>
<!--#exec cmd="ls" -->
</pre>
ou, sous Windows
<pre>
<!--#exec cmd="dir" -->
</pre>
Vous noterez probablement l'�trange formatage provoqu� par cette
directive sous Windows, car la sortie de dir
contient
la cha�ne de caract�res "<dir
>", ce qui trompe le
navigateur.
Notez que cette fonctionnalit� est tr�s dangereuse, car elle va
permettre d'ex�cuter tout code associ� � l'�l�ment
exec
. Si vous �tes dans la situation o� les
utilisateurs peuvent �diter le contenu de vos pages web, dans le cas
d'un "livre d'or" par exemple, assurez-vous de d�sactiver cette
fonctionnalit�. Vous pouvez, tout en permettant les SSI, d�sactiver
la fonctionnalit� exec
� l'aide de l'argument
IncludesNOEXEC
de la directive
Options
.
Outre l'affichage de contenu, les SSI d'Apache vous permettent de d�finir des variables, et de les utiliser dans des comparaisons et des conditions.
Avec l'�l�ment set
, vous pouvez d�finir des
variables pour un usage ult�rieur. Comme nous en aurons besoin plus
loin, nous allons en parler tout de suite. La syntaxe se pr�sente
comme suit :
<!--#set var="name" value="Rich" -->
Pour affecter une valeur � vos variables, en plus de la
d�finition litt�rale de l'exemple ci-dessus, vous pouvez utiliser
une autre variable, y compris les variables d'environnement, ou les variables
d�crites plus haut (comme LAST_MODIFIED
par exemple).
Pour indiquer qu'il s'agit d'une variable et non d'une cha�ne, vous
devez utiliser le symbole dollar ($) devant le nom de la
variable.
<!--#set var="modified" value="$LAST_MODIFIED" -->
Pour ins�rer un caract�re $ dans la valeur de votre variable, vous devez l'�chapper � l'aide d'un backslash.
<!--#set var="cost" value="\$100" -->
Enfin, si vous voulez ins�rer une variable dans une cha�ne, et s'il y a une chance pour que le nom de la variable se confonde avec le reste de la cha�ne, vous pouvez l'entourer d'accolades pour eviter toute confusion (Il est difficile de trouver un bon exemple pour illustrer ceci, mais j'esp�re que vous comprendrez).
<!--#set var="date" value="${DATE_LOCAL}_${DATE_GMT}" -->
Maintenent que nous avons des variables, et que nous pouvons
d�finir et comparer leurs valeurs, nous sommes � m�me de les
utiliser dans des expressions conditionnelles. Ceci conf�re � SSI le
statut de petit langage de programmation.
mod_include
fournit une structure if
,
elif
, else
, endif
pour la
construction d'expressions conditionnelles, ce qui vous permet de
g�n�rer plusieurs pages logiques � partir d'une seule vraie
page.
La structure de l'expression conditionnelle est :
<!--#if expr="condition" -->
<!--#elif expr="condition" -->
<!--#else -->
<!--#endif -->
Une condition peut rev�tir la forme de toute comparaison
logique - soit une comparaison de valeurs avec une autre, soit une
v�rification de la "v�rit�" d'une valeur particuli�re (Une cha�ne
donn�e est vraie si elle n'est pas vide). Pour une liste exhaustive
des op�rateurs de comparaison disponibles, voir la documentation du
module mod_include
.
Par exemple, spour ins�rer l'heure du jour dans votre page web, vous pouvez ajouter ces lignes dans la page HTML :
Good
<!--#if expr="%{TIME_HOUR} >=12" -->
morning!
<!--#else -->
afternoon!
<!--#endif -->
Toute autre variable (que vous avez d�finie, ou une variable d'environnement normale) peut �tre utilis�e dans les expressions conditionnelles. Voir le document Expressions rationnelles dans le serveur HTTP Apache pour plus de d�tails � propos du fonctionnement du moteur d'�valuation des expressions rationnelles.
Associ�e � la possibilit� avec Apache de d�finir
des variables d'environnement � l'aide de directives
SetEnvIf
, ainsi que d'autres directives en rapport,
cette fonctionnalit� vous permet d'ajouter une grande vari�t�
de contenus dynamiques c�t� serveur sans avoir � concevoir une
application web de A � Z.
SSI ne remplace certainement pas CGI, ou d'autres technologies utilis�es pour la g�n�ration de pages web dynamiques. Mais c'est une bonne m�thode pour ajouter des petits contenus dynamiques � vos pages, sans devoir fournir un gros effort suppl�mentaire.