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

SSI en exemples

Pour commencer sur les raisons qui m'ont poussé à écrire cet article: dans les discussions des membres du All-Russian Webmasters Club, des différends ont surgi sur ce qui est préférable d'utiliser dans le cas d'un balisage répété (informations) sur un grand nombre de pages - cadres, JavaScript ou SSI (Server Side Includes). Ma conviction profonde est que les cadres ne doivent être utilisés que là où vous ne pouvez vraiment pas vous en passer, JavaScript (et tout autre script client) est trop capricieux et dépend des paramètres du navigateur. Il ne peut donc être utilisé que pour des fonctionnalités supplémentaires, mais pour bâtiment, par exemple, les systèmes de navigation. Je ne discuterai pas du fait que la technologie SSI est plus raide que toutes les montagnes et tous les œufs, mais je fournirai simplement des solutions aux problèmes pratiques courants liés à l'utilisation de cette technologie.

(J'anticipe immédiatement l'indignation des supporters ASP et PHP, avec l'utilisation de solutions de telles tâches également possibles, donc, surtout pour eux: la technologie SSI est beaucoup plus simple, elle ne compte qu'une douzaine d'opérations; par conséquent, c'est un meilleur choix, même si il peut être rapidement maîtrisé)

Date de dernière modification

Directive simple:

  <! - # echo var = "LAST_MODIFIED" -> 

Le numéro d'aujourd'hui dans le bon format

Si nous devons afficher la date non pas dans la norme pour ce formulaire de configuration logicielle mais dans ce dont nous avons besoin (par exemple, "mardi 30 mai 2000"), nous pouvons utiliser la construction suivante: Obtenir le jour de la semaine

  <! - # config timefmt = "% u" ->
 <! - # set var = "NUM_DAY" value = "$ DATE_LOCAL" ->
 <! - # if expr = "$ NUM_DAY = 1" ->
 <! - # set var = "DAY" value = "Monday" ->
 <! - # elif expr = "$ NUM_DAY = 2" ->
 <! - # set var = "DAY" value = "Tuesday" ->
 <! - # elif expr = "$ NUM_DAY = 3" ->
 <! - # set var = "DAY" value = "environment" ->

 <! - # elif expr = "$ NUM_DAY = 4" ->
 <! - # set var = "DAY" value = "Thursday" ->
 <! - # elif expr = "$ NUM_DAY = 5" ->
 <! - # set var = "DAY" value = "Friday" ->
 <! - # elif expr = "$ NUM_DAY = 6" ->
 <! - # set var = "DAY" value = "Saturday" ->
 <! - # else ->
 <! - # set var = "DAY" value = "Sunday" ->
 <! - # endif -> 

Obtenir le numéro

  <! - # config timefmt = "% e" ->
 <! - # set var = "DATE" value = "$ DATE_LOCAL" -> 

Obtenir le nom du mois

  <! - # config timefmt = "% m" ->
 <! - # set var = "NUM_MONTH" value = "$ DATE_LOCAL" ->
 <! - # if expr = "$ NUM_MONTH = 01" ->
 <! - # set var = "MONTH" value = "January" ->
 <! - # elif expr = "$ NUM_MONTH = 02" ->

 <! - # set var = "MONTH" value = "February" ->
 <! - # elif expr = "$ NUM_MONTH = 03" ->
 <! - # set var = "MONTH" value = "March" ->
 <! - # elif expr = "$ NUM_MONTH = 04" ->
 <! - # set var = "MONTH" value = "April" ->
 <! - # elif expr = "$ NUM_MONTH = 05" ->
 <! - # set var = "MONTH" value = "May" ->
 <! - # elif expr = "$ NUM_MONTH = 06" ->
 <! - # set var = "MONTH" value = "June" ->

 <! - # elif expr = "$ NUM_MONTH = 07" ->
 <! - # set var = "MONTH" value = "July" ->
 <! - # elif expr = "$ NUM_MONTH = 08" ->
 <! - # set var = "MONTH" value = "August" ->
 <! - # elif expr = "$ NUM_MONTH = 09" ->
 <! - # set var = "MONTH" value = "September" ->
 <! - # elif expr = "$ NUM_MONTH = 10" ->
 <! - # set var = "MONTH" value = "October" ->
 <! - # elif expr = "$ NUM_MONTH = 11" ->

 <! - # set var = "MONTH" value = "November" ->
 <! - # else ->
 <! - # set var = "MONTH" value = "December" ->
 <! - # endif -> 

Obtenir l'année

  <! - # config timefmt = "% G" ->
 <! - # set var = "YEAR" value = "$ DATE_LOCAL" -> 

La sortie réelle de la chaîne résultante

  <! - # echo var = "DAY" ->,

 <! - # echo var = "DATE" ->
 <! - # echo var = "MOIS" ->,
 <! - # echo var = "YEAR" ->

Les formats de paramètre pour config timefmt doivent être visualisés séparément pour chaque configuration de serveur Web. L'exemple donné est FreeBSD, Apache. Voir man timefmt pour plus de détails.
Ce dessin est utilisé sur le site Web de la boutique en ligne Levingston.Ru

Date de modification du fichier externe

Souvent, sur des sites informatiques, établissez la liste de prix au format MS Excel ou Word et indiquez chaque fois la date de fabrication. Avec SSI, cela se fait à peu près comme suit:

  <a href=pricelst.doc> Liste de prix </a>

 <! - # config timefmt = "% d.% m.% y" ->
 (MS Word 6.0 / 95, <! - # flastmod virtual = "pricelst.doc" ->) 

Cette conception est utilisée sur le site Web du service Duncan .

Combattre <noframes>

En règle générale, dans ce conteneur, ils écrivent "désolé, mais vous devez mettre à jour le navigateur". En théorie, il devrait exister une alternative pour les utilisateurs d'anciennes versions de navigateurs. Comme sur un serveur normal, les informations changent fréquemment et le webmaster est paresseux pour effectuer des modifications à deux endroits à chaque fois. Avec l'aide de SSI, le problème est résolu une fois pour toutes: une directive est insérée dans le conteneur <noframes> </ noframes>, insérant le même fichier dans lequel les modifications sont apportées ou simplement une barre de navigation.

Combattre les liens directs vers des documents sur un site Web avec des cadres

L'un des arguments contre l'utilisation de structures de cadre lors de la création de sites Web est le désagrément des liens directs vers les fichiers de contenu. Par exemple, lorsque vous créez un lien depuis des moteurs de recherche ou vers un document spécifique (non root) d'un autre site Web, l'utilisateur est dirigé vers une page sans éléments de conception ou de navigation, qui sont généralement placés dans un cadre de navigation séparé. Avec une simple conception SSI, ce problème peut être résolu. Pour ce faire, il est nécessaire d'analyser la provenance de l'utilisateur (variable HTTP_REFERER). S'il ne venait pas de notre serveur, mais de l'extérieur, créez une structure de cadre et substituez le document demandé par l'utilisateur sous forme de cadre significatif.

Dans l'exemple ci-dessous, le fichier content.html est le document sur lequel il existe un lien direct (par exemple, depuis un moteur de recherche), frame.html est le fichier dans lequel la structure de cadre est construite. La valeur de done est substituée dans QUERY_STRING afin d'éviter l'imbrication infinie des structures de cadre.

Fichier Content.html

  <html>
 <tête>
 ...
 <! - # include virtual = "frame.html" ->
 </ head>
 <body>

 ...
 </ body>
 </ html> 

Fichier Frame.html

  <! - # if expr = "$ QUERY_STRING! = terminé && $ HTTP_REFERER! = / votre_domaine \ .ru /" ->
 <frameset rows = "150, *">
 <frame name = "NAVIGATION" src = "/ navigation.html">
 <frame name = "CONTENT" src = "<! - # echo var =" DOCUMENT_URI "->? done" ">

 </ frameset>
 <! - # endif -> 

Ce dessin est utilisé sur le site de la boutique en ligne Bolero

Version d'impression

Il y a souvent une tâche appliquée - un beau design multicolonne avec des majuscules et des minuscules, un nuage de bannières, mais lors de l'impression, tout cela n'est pas nécessaire - du papier supplémentaire, des informations inutiles ... Par conséquent, je souhaite créer une page alternative simple pour l'impression. Pour ce faire, il suffit de préparer deux versions des majuscules supérieure et inférieure, l’une pour l’affichage à l’écran, l’autre pour l’impression. Pour basculer entre ces options, utilisez la variable QUERY_STRING. Vous trouverez ci-dessous les principales structures de la page elle-même (fichier.html) et des en-têtes supérieur et inférieur (top.html et bottom.html).

La structure de la page elle-même (fichier.html):

  <! - # include virtual = "top.html? $ QUERY_STRING" ->
 voici le corps du document
 <! - # include virtual = "bottom.html? $ QUERY_STRING" -> 

Structure top.html et bottom.html

  <! - # if expr = "$ QUERY_STRING == / for_printing /" ->
 casquette d'impression
 <! - # else ->
 chapeau pour regarder
 <! - # endif -> 

Le lien sur chaque page devrait être comme

  <a href=<"!--echo var="$DOCUMENT_URI" -->? for_printing
 > version imprimée </a> 

Cette conception est utilisée sur le site Web du All-Russian Webmasters Club.

Éléments de menu de combat

Supposons que nous ayons plusieurs sections du site Web et que les documents liés aux sections se trouvent dans des répertoires différents. La tâche consiste à faire en sorte que, dans le menu de navigation de ces sections, il disparaisse (ou ne soit pas mis en surbrillance, dans une couleur différente, etc.) un lien vers la section dans laquelle l'utilisateur se trouve actuellement. Pour ce faire, vous pouvez utiliser la variable DOCUMENT_URI.

  <! - # if expr = "$ DOCUMENT_URI! = / ^ \ / index.html /" ->
 <a href="/"> Première page </a> <br>
 <! - # endif ->

 <! - # if expr = "$ DOCUMENT_URI! = / \ / about \ / index.html/" ->
 <a href="/about/"> À propos de nous </a> <br>
 <! - # endif ->
 <! - # if expr = "$ DOCUMENT_URI! = / \ / done \ /index.html/" ->
 <a href="/done/"> Nos travaux </a> <br>
 <! - # endif ->

 <! - # if expr = "$ DOCUMENT_URI! = / \ / partner \ /index.html/" ->
 <a href="/partner/"> Nos partenaires </a> <br>
 <! - # endif ->
 <! - # if expr = "$ DOCUMENT_URI! = / \ / client \ /index.html/" ->
 <a href="/client/"> Nos clients </a> <br>
 <! - # endif ->

 <! - # if expr = "$ DOCUMENT_URI! = / \ / price \ /index.html/" ->
 <a href="/price/"> Nos prix </a> <br>
 <! - # endif ->
 <! - # if expr = "$ DOCUMENT_URI! = / \ / contacts \ /index.html/" ->
 <a href="/contacts/"> Nos coordonnées </a> <br>
 <! - # endif ->

 <! - # if expr = "$ DOCUMENT_URI! = / \ / history \ /index.html/" ->
 <a href="/history/"> Notre histoire </a> <br>
 <! - # endif ->
 <! - # if expr = "$ DOCUMENT_URI! = / \ / search.html /" ->
 <a href="/search.html"> Recherche </a> <br>
 <! - # endif -> 

Cette conception est utilisée par le site Web Web 2000.

Sortie de texte contextuel en fonction des conditions

Supposons que nous ayons pour tâche de modifier l'apparence de la première page du site, en fonction de l'origine de l'utilisateur. Pour accomplir cette tâche, la construction suivante est utilisée:

  <! - # if expr = "$ HTTP_REFERER = / www.zzz.ru /" ->
 Ici, les actions nécessaires sont prises.
 <! - # endif -> 

c'est-à-dire comparer la variable HTTP_REFERER

Combattre différentes versions de design pour différents navigateurs

Tout le monde sait que les navigateurs de différents fabricants et versions affichent le même balisage HTML d'un document de différentes manières, allant des balises et attributs spéciaux à la prise en charge de différentes versions de JavaScript. Pour que le site Web paraisse normal pour une version de navigateur et pour une autre, ou pour éviter les erreurs JavaScript à l'aide de SSI, vous pouvez vérifier les versions ou les navigateurs et afficher différentes versions du balisage HTML. Pour cela, la variable HTTP_USER_AGENT est analysée. Elle contient des informations sur le type et le fabricant du navigateur:

  <! - # if expr = "$ HTTP_USER_AGENT = / Mozilla \ / 4 / || $ HTTP_USER_AGENT = / Mozilla \ / 5 /" ->
 Si la version du navigateur n'est pas 4 ou 5, affichez l'option
 conception utilisant par exemple DHTML
 <! - # else ->
 Imprimer un design simple ici.
 <! - # endif ->

Un design similaire a été utilisé pour construire la structure du cadre et afficher le menu interne (pour Netscape - sur DHTML, pour MSIE - sur ActiveX) sur le site Web de OM

La lutte contre la conception des résultats des scripts

Le plus gros problème avec les scripts est que, si un grand nombre de logiciels sont acquis, leur conception nécessite une reconfiguration. Il est bon que le logiciel soit correctement conçu et que le changement des modèles d'affichage ne concerne pas les mathématiques, mais dans ce cas, il y a des problèmes. Par exemple, sur une page de recherche, il serait intéressant d’utiliser des bannières et des réseaux publicitaires, mais les directives SSI ne sont pas traitées dans les fichiers .cgi. Vous pouvez résoudre ces problèmes en utilisant SSI comme suit: n'utilisez pas de script pour traiter les modèles d'affichage, mais appelez un script depuis un document HTML via SSI (malheureusement, vous ne pouvez utiliser que les scripts qui utilisent la méthode GET - la variable CONTENT_LENGTH n'est pas disponible dans SSI) Comment cela se passe-t-il? Il existe un document HTML balisé dans un style général. La directive y est insérée.

  <! - # include virtual = "/ cgi-bin / script.cgi? $ QUERY_STRING" -> 

Dans la première étape, alors que QUERY_STRING est vide, la première étape du script est appelée. Dans les étapes suivantes du script, les paramètres nécessaires sont transmis. Dans le script lui-même, trois lignes sont importantes:

  ...
 # déterminer l'adresse où envoyer les données
 $ query = $ ENV {QUERY_STRING};
 # déterminer le lieu à partir duquel le script a été appelé
 $ uri = $ ENV {DOCUMENT_URI};
 ...
 # envoi de données au même document HTML à partir duquel le script a été appelé
 print "<action formulaire = $ méthode uri = get> \ n";
 ... 

Un modèle similaire est utilisé dans la section "Vote" du supermarché en ligne Levingston.Ru

Que peut-on faire avec Cookie et SSI?

Souvent trouvé la construction sur JavaScript, qui affiche "Bonjour Ivan Ivanovich!" lors de la saisie d'une page de site Web. La même chose peut être faite en utilisant la directive SSI

  <! - # echo var = "HTTP_COOKIE" -> 

Bannières, Caching et SSI

Envoyé par Kiril Khlopov (NewTech)

Comme vous le savez, les systèmes de bannières proposent d’inclure dans le code des variables aléatoires dans l’URL du script d’affichage - une protection contre la mise en cache.

  • Vous pouvez générer une page entière avec un script, du premier au dernier caractère.
  • Peut être fait comme indiqué dans les pages d'aide du système de bannière - inclure par script SSI, générer une bannière aléatoire
  • Enregistrement dynamique d'une partie d'un document avec le code de bannière de JavaScriper

Et vous pouvez toujours aimer ça:

  <! - # config timefmt = "% s" ->

 <! - # set var = "RND" value = "$ DATE_LOCAL" ->
 <! - Russian LinkExchange code START ->
 <iframe src = http: //www.linkexchange.ru/cgi-bin/erle.cgi? some_id?
 <! - # echo var = "RND" ->
 frameborder = 0 vspace = 0 hspace = 0 largeur = 468 hauteur = 60 marginwidth = 0
  marginheight = 0 scrolling = no>
 <a href=http://www.linkexchange.ru/users/some_id/goto.map target=_top>
 <img src = http: //www.linkexchange.ru/cgi-bin/rle.cgi ?? <! - # echo var = "RND" ->
 alt = "Réseau de bannières RLE" border = 0 height = 60 width = 468> </a>

 </ iframe>
 <! - Russian LinkExchange code END -> 

Autrement dit, le nombre de secondes à partir de 1970 apparaîtra comme une variable aléatoire. Le temps n'est pas perdu et la mémoire pour le lancement d'un générateur de script, Java-Script (comme il est maintenant à la mode chez certains utilisateurs) peut être désactivée. A mon avis c'est assez rose Sourire heureux
Tout cela est testé et appliqué par notre administrateur sur www.j2.ru

Un modèle d'affichage - contenu différent

Envoyé par Evgeny Bespalchikov (KADIS)

Les modèles sont souvent utilisés de cette manière: <> il n’existe qu’un seul fichier décrivant la structure de la page, et le contenu principal est inclus dans la directive

  <! - # include virtual = "$ QUERY_STRING.html" -> 
les liens, respectivement, seront:
  href = "www.votre_domaine.ru/index.html?page1"
 href = "www.votre_domaine.ru/index.html?page2"
 ... 

Le problème se produit si l'utilisateur compose l'adresse directement http://www.votre_domaine.ru, c'est-à-dire QUERY_STRING = ""

Solution:

  <! - # if expr = "$ QUERY_STRING" ->
 <! - # include virtual = "$ QUERY_STRING.html" ->
 <! - # else ->
 <! - # include virtual = "default.html" ->

 <! - # endif -> 

où default.html est la page d'index racine (table des matières) et est simplement un stub.