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

SSI dans les exemples

Tout d'abord, les raisons qui m'ont incité à écrire cet article: les discussions des membres du Club All-Russian des webmasters ont souvent discuté de ce qu'il vaut mieux appliquer en cas de balisage répété sur un grand nombre de pages - frames, JavaScript ou SSI (Server Side Includes). Ma conviction profonde est que les cadres devraient être utilisés seulement là où il n'y a vraiment aucun moyen de s'en passer, JavaScript (et tout autre script client) est trop capricieux et dépend des paramètres du navigateur, donc il ne peut être utilisé que pour des fonctionnalités supplémentaires. la construction, par exemple, les systèmes de navigation. Je ne vais pas discuter avec de la mousse à la bouche que la technologie SSI est plus raide que toutes les montagnes et les œufs, mais je vais simplement donner des solutions aux problèmes qui se produisent souvent dans la pratique avec l'utilisation de cette technologie.

(Prévoir immédiatement l'indignation des adhérents aux technologies ASP et PHP, avec lesquelles des solutions de tâches similaires sont également possibles, surtout pour eux: la technologie SSI est beaucoup plus simple, elle n'a qu'une douzaine d'opérations, donc pour un non programmeur il peut être rapidement maîtrisé)

Date de la dernière modification du document

Directive simple:

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

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

Si nous avons besoin d'afficher la date pas dans le formulaire standard pour la configuration du logiciel, mais ce dont nous avons besoin (par exemple, "Mardi, 30 mai 2000"), nous pouvons utiliser la conception suivante: Obtenir le jour de la semaine

  <! - # config timefmt = "% u" ->
 <! - # set var = "NUM_DAY" value = "$ DATE_LOCAL" ->
 <! - # si expr = "$ NUM_DAY = 1" ->
 <! - # set var = "DAY" value = "Lundi" ->
 <! - # elif expr = "$ NUM_DAY = 2" ->
 <! - # set var = "DAY" value = "Mardi" ->
 <! - # elif expr = "$ NUM_DAY = 3" ->
 <! - # set var = "DAY" value = "environnement" ->

 <! - # elif expr = "$ NUM_DAY = 4" ->
 <! - # set var = "JOUR" value = "Jeudi" ->
 <! - # elif expr = "$ NUM_DAY = 5" ->
 <! - # set var = "DAY" value = "Vendredi" ->
 <! - # elif expr = "$ NUM_DAY = 6" ->
 <! - # set var = "DAY" value = "Samedi" ->
 <! - # else ->
 <! - # set var = "JOUR" value = "Dimanche" ->
 <! - # 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" ->
 <! - # si expr = "$ NUM_MONTH = 01" ->
 <! - # set var = "MONTH" value = "Janvier" ->
 <! - # elif expr = "$ NUM_MONTH = 02" ->

 <! - # set var = "MOIS" value = "Février" ->
 <! - # elif expr = "$ NUM_MONTH = 03" ->
 <! - # set var = "MONTH" value = "Mars" ->
 <! - # elif expr = "$ NUM_MONTH = 04" ->
 <! - # set var = "MONTH" value = "Avril" ->
 <! - # elif expr = "$ NUM_MONTH = 05" ->
 <! - # set var = "MONTH" value = "Mai" ->
 <! - # elif expr = "$ NUM_MONTH = 06" ->
 <! - # set var = "MONTH" value = "Juin" ->

 <! - # elif expr = "$ NUM_MONTH = 07" ->
 <! - # set var = "MONTH" value = "Juillet" ->
 <! - # elif expr = "$ NUM_MONTH = 08" ->
 <! - # set var = "MONTH" value = "Août" ->
 <! - # elif expr = "$ NUM_MONTH = 09" ->
 <! - # set var = "MONTH" value = "Septembre" ->
 <! - # elif expr = "$ NUM_MONTH = 10" ->
 <! - # set var = "MONTH" value = "Octobre" ->
 <! - # elif expr = "$ NUM_MONTH = 11" ->

 <! - # set var = "MONTH" value = "Novembre" ->
 <! - # else ->
 <! - # set var = "MONTH" value = "Décembre" ->
 <! - # endif -> 

Obtention de l'année

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

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

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

 <! - # echo var = "DATE" ->
 <! - # echo var = "MOIS" ->,
 <! - # echo var = "ANNÉE" ->

Les paramètres de config timefmt doivent être vérifiés séparément pour chaque configuration du serveur Web. L'exemple ci-dessus est FreeBSD, Apache. Pour plus d'informations, voir man timefmt
Un design similaire est utilisé sur le site de la boutique en ligne Levingston.Ru

Date de modification du fichier externe

Souvent, sur les sites informatiques, une liste de prix est étalée en format MS Excel ou Word et chaque fois ils écrivent la date de leur fabrication avec leurs mains. En utilisant SSI, ceci est fait approximativement 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 de Duncan Service

La lutte contre <noframes>

En règle générale, dans ce conteneur, écrivez "désolé, mais vous devriez mettre à jour le navigateur", en théorie, il devrait y avoir une alternative pour les utilisateurs d'anciennes versions de navigateurs. Puisque sur un serveur normal l'information est souvent changée, et le webmaster est chaque fois paresseux pour faire des éditions dans deux endroits. Avec SSI, le problème est résolu une fois pour toutes: une directive est insérée dans le conteneur <noframes> </ noframes>, en insérant le même fichier dans lequel les modifications ou simplement la barre de navigation sont faites.

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

L'un des arguments contre l'utilisation de structures de cadres lors de la création de sites Web est l'inconvénient des liens directs vers les fichiers de contenu. Par exemple, lorsque vous liez à partir de moteurs de recherche ou d'un document spécifique (non racine) d'un autre site Web, l'internaute accède à une page dépourvue d'éléments de conception ou de navigation généralement placés dans un cadre de navigation distinct. Avec l'aide d'une conception SSI simple, ce problème peut être résolu. Pour ce faire, vous devez analyser d'où vient l'utilisateur (variable HTTP_REFERER) s'il ne vient pas de notre serveur, mais de l'extérieur - pour construire la structure de trame et remplacer le document demandé par l'utilisateur comme un cadre significatif.

Dans l'exemple ci-dessous, le fichier content.html est le document référencé directement (par exemple, à partir du moteur de recherche), frame.html est le fichier dans lequel la structure de trame est construite. QUERY_STRING remplace la valeur effectuée afin d'éviter l'imbrication infinie des structures de trame.

Fichier content.html

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

 ...
 </ body>
 </ html> 

Fichier frame.html

  <! - # si 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 "->? terminé">

 </ frameset>
 <! - # endif -> 

Un design similaire est utilisé sur le site de la boutique en ligne Bolero

Version de la page pour l'impression

Souvent, il ya un problème appliqué - une belle conception multi-colonnes avec des bouchons haut et bas, un nuage de bannières, mais quand vous imprimez tout n'est pas nécessaire - papier excédentaire, informations inutiles ... Par conséquent, je veux faire une autre page. Pour ce faire, il suffit de préparer deux versions des capots supérieur et inférieur, l'une pour l'affichage à l'écran, l'autre pour l'impression. Pour basculer entre ces options, utilisez la variable QUERY_STRING. Voici les structures de base de la page elle-même (fichier.html) et des majuscules et des minuscules (top.html et bottom.html).

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

  <! - # si expr = "$ QUERY_STRING == / for_printing /" ->
 bouchon d'impression
 <! - # else ->
 en-tête pour la visualisation
 <! - # endif -> 

Le lien sur chaque page devrait être de la forme

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

Un design similaire est utilisé sur le site Web du Club des webmasters de toute la Russie

Combattre les éléments de menu

Supposons que nous ayons plusieurs sections du site Web, les documents relatifs aux sections se trouvent dans des répertoires différents. La tâche consiste à faire référence à la section dans laquelle l'utilisateur se trouve actuellement dans le menu de navigation de ces sections (ou non en surbrillance, surlignée dans une couleur différente, etc.). Pour ce faire, vous pouvez utiliser la variable DOCUMENT_URI.

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

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

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

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

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

Une conception similaire est utilisée par le site Web Web 2000

Sortie de texte contextuel en fonction des conditions

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

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

c'est à dire la variable HTTP_REFERER est comparée

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

Tout le monde sait que les navigateurs de différents fabricants et versions affichent différemment le même balisage HTML du document, en commençant par des balises et des attributs spéciaux et en finissant par prendre en charge différentes versions de JavaScript. Pour que le site Web soit approprié pour une version du navigateur et pour l'autre, ou pour éviter les erreurs JavaScript à l'aide de SSI, vous pouvez rechercher des versions ou des navigateurs et générer diverses options de marquage HTML. Pour cela, la variable HTTP_USER_AGENT est analysée, qui contient des informations sur le type et le fabricant du navigateur:

  <! - # si expr = "$ HTTP_USER_AGENT = / Mozilla \ / 4 / || $ HTTP_USER_AGENT = / Mozilla \ / 5 /" ->
 Si la version du navigateur n'est pas la même que 4 ou 5, affichez l'option
 conception, en utilisant, par exemple, DHTML
 <! - # else ->
 Ici vous pouvez obtenir un design simple
 <! - # endif ->

Une construction similaire a été utilisée pour construire la structure de trame et afficher le menu interne (pour Netscape - pour DHTML, pour MSIE - pour ActiveX) sur le site Web du magazine "OM"

La lutte avec la conception des résultats du travail des scripts

Le plus gros problème avec les scripts réside dans le fait que s'il y a une grande quantité de logiciels, lors de la modification de la conception, ils doivent être reconfigurés. Eh bien, si le logiciel est fait correctement et que la modification des modèles d'affichage ne concerne pas les mathématiques en soi, dans ce cas, il y a des problèmes. Par exemple, sur la page de recherche, il serait bien de tordre les bannières et les réseaux publicitaires, mais les directives SSI ne sont pas implémentées dans les fichiers .cgi. Vous pouvez résoudre ces problèmes en utilisant SSI comme suit: ne pas traiter les modèles d'affichage avec le script, mais appeler le script du document HTML via SSI (malheureusement, vous ne pouvez travailler qu'avec les scripts utilisant la méthode GET - la variable CONTENT_LENGTH n'est pas disponible dans SSI) , comme cela est fait, il y a un document HTML qui est étiqueté dans un style de design général. Il insère une directive

  <! - # 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 invoquée, dans les étapes suivantes du script - les paramètres nécessaires sont transférés. Dans le script lui-même, trois lignes sont importantes:

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

Un design similaire a été utilisé dans la section " Votes " pour le supermarché en ligne Levingston.Ru

Que puis-je faire avec Cookie et SSI?

Il y a souvent une construction JavaScript qui affiche "Bonjour, Ivan Ivanych!" lorsque vous visitez la page du site Web. La même chose peut être faite avec la directive SSI

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

Bannières, mise en cache et SSI

Envoyé par Kiril Khlopov (NewTech)

Comme vous le savez, les systèmes de bannière offrent d'inclure dans le code une valeur aléatoire dans l'URL du script d'affichage - protection contre la mise en cache.

  • Vous pouvez générer la page entière avec un script, du premier au dernier caractère
  • Vous pouvez faire comme les pages conseillées aider les systèmes de bannière - inclure par le script SSI, générant une bannière aléatoire
  • Enregistrer dynamiquement une partie du document avec le code de la bannière JavaScrip

Et c'est encore possible:

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

 <! - # set var = "RND" value = "$ DATE_LOCAL" ->
 <! - Russe 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 height = 60 marginwidth = 0
  marginheight = 0 défilement = non>
 <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>
 <! - Russe LinkExchange code END -> 

Autrement dit, comment une variable aléatoire va effectuer le nombre de secondes à partir de 1970. Le temps n'est pas perdu et la mémoire pour exécuter le générateur de script, Java-Script (comme chez certains utilisateurs maintenant il est à la mode) peut être désactivée. À mon avis, c'est plutôt rose Souris heureux
Tout ceci est vérifié et appliqué par notre administrateur sur www.j2.ru

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

Envoyé par Eugene Bespalchikov (KADIS)

Souvent, les modèles utilisent cette méthode: <> un seul fichier décrit la structure de la page et le contenu principal est inclus dans la directive

  <! - # include virtual = "$ QUERY_STRING.html" -> 
liens, respectivement, ressemblera à:
  href = "www.votre_domaine.fr/index.html?page1"
 href = "www.votre_domaine.com/index.html?page2"
 ... 

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

Solution:

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

 <! - # endif -> 

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