XSSI - utökad SSI

Detta är kommandon som körs på webbservern och formar webbsidan innan den skickas iväg. Har testat vilka kommandon som fungerar på Algonet, förutom de grundläggande, och hittat ett antal, som jag också ger exempel med ...

Ändrad konfigurering 21 jan?

Tidigare har variabler kunnat användas för att variera innehållet med taggar innehållande < >.
Den 21 jan upptäckte jag att de numera kan tolkas som &lt; &gt; och då inte går att använda som tidigare! Så småningom märkte jag att felet inte var "stabilt" utan varierade med Algonets interna serveradress (visas med <!--#echo var="SERVER_ADDR" -->)
10.42.11.10 tolkar som &lt; &gt; - och här fungerar PHP! (nyinstallerat)
10.42.11.20 tolkar som tidigare - men här fungerar inte PHP!

Jag har include-filer med text som ska visas på olika sätt beroende på i vilket sammanhang den visas- med resp utan gul pil. I stället för att ändra variabeln <!--#set var="pil" value=""> " får man nu byta includefil; ange t ex <!--#set var="pil" value="blank.html" -->.
Nedan visas de två kodvarianterna, som tidigare båda visade en gul pil! På sista raden växlar det beroende på server!!

Med variabel Med fil
Tidigare kod <!--#set var="pil" value="<img src=\"../img/yellarrow.gif\" width=13 height=13 valign=center alt=\"Pil\"> " --> <!--#echo var="pil" --> <!--#set var="pil" value="gulpil.html" --> <!--#include file="$pil" -->
På 10.42.11.10<img src="../img/yellarrow.gif" width=13 height=13 valign=center alt="Pil">
Nu 91.201.60.12 <img src="../img/yellarrow.gif" width=13 height=13 valign=center alt="Pil">

Ladda om några gånger för att använda båda serveradresserna!

Allmänt

På Algonet kan man sedan länge använda SSI (Server Side Includes).Algonet FAQ hänvisar till Eva von Pepels sida om SSI som ger en bra introduktion av tillgängliga grundläggande kommandon, nämligen:
#include för att inkludera annan fil
#fsize visar filstorlek
#flastmod visar fildatum
#config errmsg, sizefmt, timefmt ställer in visning av felmeddelande, filstorlek resp (rikligast, se man strftime i UNIX!) tid
#echo återger variabel (finns åtskilliga!) och dessutom
#exec (av säkerhetskäl ofta avstängt)

När jag skulle ändra på en sida ville jag kolla syntax och råkade hitta flera kommandon som jag nu testat med varierande framgång. Det finns i Apache 1.2 ett antal utökade kommandon - Extended Server Side Includes (XSSI). Man får ett "programmeringsspråk" som i sin torftighet ger möjliget att dynamiskt och snabbt forma innehållet i webbsidan utifrån variabler man själv kan påverka. Detta sker innan sidan går från servern och alltså oberoende av webbläsare och långsamma linor. (Dessutom finns ytterligare tillägg som inte är tillgängliga på Algonet.)

OBS! Eftersom jag har internetkonto på Algonet är mycket nedan anpassat till detta, men en del kan säkert tillämpas på andra unix-servrar med Apache som webbserver!

Normalt ska filerna ha ändelsen .shtml. Ska flertalet webbfiler tolkas, kan man för en kataloggren lägga till i (resp skapa) filen .htaccess så tolkas också alla html-filer:
AddHandler server-parsed .html

XSSI ska vara extremt "snällt" mot servern, till skillnad från CGI-skript. Så man ska inta vara rädd att utnyttja de möjligheter som finns med metoden.

Åter början

Lista på tillägg i XSSI

#set sätter värde på miljövariabel
#printenv visar alla miljövariabler
#if, #elif, #else, #endif flödeskontroll

Miljövariabler, nu också egna

Ett nytt SSI-direktiv, #set gör det möjligt att sätta värde på egna miljövariabler.

<!--#set var="namn"value="värde -->
Det finns dessutom redan en stor mängd miljövariabler som man kan använda till "#echo", "#if" eller i CGI-skript. På en testsida med koden:
<font size="-1"><PRE>
<!--#printenv -->
</PRE></FONT>
får man en lista med alla aktuella miljövariabler (även egna, t ex
<!--#set var="testar" value="viktigt!!" -->):
UNIQUE_ID=TIqZclvJPAwAAG0dJboAAAAA
HTTP_X_CC_ID=ccc04-01
HTTP_HOST=faq.folkmusikhuset.se
HTTP_USER_AGENT=CCBot/1.0 (+http://www.commoncrawl.org/bot.html)
HTTP_ACCEPT=text/html,application/xhtml+xml,text/xml;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
HTTP_ACCEPT_LANGUAGE=en-us,en;q=0.5
HTTP_ACCEPT_ENCODING=gzip
HTTP_ACCEPT_CHARSET=ISO-8859-1,utf-8;q=0.7,*;q=0.7
HTTP_CONNECTION=close
HTTP_CACHE_CONTROL=no-cache
HTTP_PRAGMA=no-cache
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin
SERVER_SIGNATURE=<address>Apache/2.2.15 (Unix) mod_ssl/2.2.15 OpenSSL/0.9.8e-fips-rhel5 DAV/2 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635 Server at faq.folkmusikhuset.se Port 80</address>

SERVER_SOFTWARE=Apache/2.2.15 (Unix) mod_ssl/2.2.15 OpenSSL/0.9.8e-fips-rhel5 DAV/2 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635
SERVER_NAME=faq.folkmusikhuset.se
SERVER_ADDR=91.201.60.12
SERVER_PORT=80
REMOTE_ADDR=38.107.191.114
DOCUMENT_ROOT=/home/folkmusi/public_html/faq
SERVER_ADMIN=webmaster@faq.folkmusikhuset.se
SCRIPT_FILENAME=/home/folkmusi/public_html/faq/xssi.shtml
REMOTE_PORT=56673
GATEWAY_INTERFACE=CGI/1.1
SERVER_PROTOCOL=HTTP/1.1
REQUEST_METHOD=GET
QUERY_STRING=
REQUEST_URI=/xssi.shtml
SCRIPT_NAME=/xssi.shtml
DATE_LOCAL=Friday, 10-Sep-2010 22:47:46 CEST
DATE_GMT=Friday, 10-Sep-2010 20:47:46 GMT
LAST_MODIFIED=Wednesday, 28-Jul-2004 16:38:17 CEST
DOCUMENT_URI=/xssi.shtml
USER_NAME=folkmusi
DOCUMENT_NAME=xssi.shtml
pil=gulpil.html
testar=viktigt!!

Åter början

Flödeskontroll

Flödeskontrollen har syntax:

<!--#if expr="testuttryck" -->
     gör detta
<!--#elif expr="testuttryck" -->
     gör det här i stället
<!--#else -->
     gör det här
<!--#endif -->

Detta tillåter att man ger dokumenten olika utseende beroende på vilken variabel och värde man testar emot (Webbläsare, veckonummer, tid på dagen etc, etc).

Trots sin begränsning är detta mycket användbart tillsammans med miljövariablerna, där man också kan söka efter mönster med hjälp av s k "regular expressions" (reguljära uttryck), konkatenera (sätta ihop) strängar och inkludera filer. Det är allt. Alltså inga beräkningsmöjligheter, hopp eller annat som är normalt i programmeringsspråk.

"Testuttryck" utvärderas av Apache. Om det är sant används den kod/text som följer (t ex XSSI-uttryck, text/HTML etc) och infogas i html-dolkumentet. Från servern skickas alltså resultatet, inte själva XSSI-uttrycken, vilket gör koden oberoende av webbläsare och inte belastar lina eller klient. Detaljer, se dokumentationen för Apache!

Lista med testuttryck:

ExpressionalValue
stringtrue if string is not empty
string1 = string2true if the two strings are identical. If the syntax /string2/ is used, string2 will be compared as a regular expression following the same syntax of the Unix egrep command
string1 != string2true if the two strings are different. Regular expressions may be used in this case also
( expression )true if expression is true
! expressiontrue if expression is false
expression1 && expression2true if expression1 and expression2 are both true
expression1 || expression2true if expression1 or expression2 is true (or both)

I uttrycken ska variabler identifieras genom att placera ett dollartecken framför ($).

Exempel på flödeskontroll:

<!--#if expr="$HTTP_USER_AGENT = /MSIE/" -->
   Placera MS Internet Explorer-specifik HTML-kod här!
<!--#elsif expr="$HTTP_USER_AGENT = /Mozilla/" -->
   Placera Netscape-specifik HTML-kod här!
<!--#else -->
   Placera allmän kod för andra webbläsare här!
<!--#endif -->

Dessa få rader med kod kontrollerar om webbläsaren är Netscape eller MS Internet Explorer. Man letar via "regular expressions" efter strängen Mozilla eller MSIE i miljövariabeln för HTTP_USER_AGENT. Man kan så undvika att skicka JavaScript till läsare som inte stöder detta, och ersätta med annan HTML-kod. Sök med ordet XSSI efter exempel med mer utvecklad kod!

Åter början

Egna exempel

Texten mellan taggarna illustrerar att man där lägger in html-kod, include-fil el dyl.

Kalendarium
(Det här borde gå mycket bättre med Utökad XSSI enligt nedan.)
Först är det bäst att skriva ett felmeddelande, för rätt vad det är har något blivit fel ...
Med tidsformatet %Y%m%d dvs YYYYMMDD kommer allt i rätt ordning

<!--#config errmsg="Fel! - Rapportera till namn@server.se" -->
<!--#config timefmt="%Y%m%d" -->
<!--#if expr="$DATE_LOCAL <= 20100910" -->
    Skriv dit det som händer i dag
<!--#endif -->
v Motsvarande upprepas för varje följande dag man har kalenderuppgifter. När man går in på sidan får man alltid aktuell dag först i kalendariet. Eller så väljer man att lägga in uppgifter veckovis med veckonummer (t ex YYYYWW) enligt nedan.

Ny sida varje vecka
Först har jag ställt datumformatet att visa veckonummer enligt vår standard (finns även andra varianter).

<!--#config timefmt="%V" -->
AKTUELLT vecka <!--#ECHO VAR="DATE_LOCAL" -->:
Sedan får datumformatet visa filnamn (typ 201036.html)
<!--#config timefmt="%Y%V.html" -->
<!--#set var="filnamn" value="$DATE_LOCAL" -->
<!--#INCLUDE FILE="$filnamn" -->
      Resten av HTML-koden
Inför varje vecka förbereder man det innehåll som är föränderligt
Variabeln "filnamn" går att använda för att visa när sidan uppdaterats med datumformat 2010-09-10:
<!--#config timefmt="%Y-%m-%d" -->
Sidan uppdaterad <!--#flastmod file="$filnamn" -->

Välj språk
Från webbläsaren skickas bl a miljövariabeln $HTTP_ACCEPT_LANGUAGE som man kan utvärdera med "regular expressions":

<!--#if expr="$HTTP_ACCEPT_LANGUAGE = /^sv,*/" -->
      Svenska
<!--#elif expr="$HTTP_ACCEPT_LANGUAGE = /^de,*/" -->
      Deutsch
<!--#elif expr="$HTTP_ACCEPT_LANGUAGE = /^en,*/" -->
      English
<!--#else -->
      English
<!--#endif -->

Fel och frågor

(här håller jag på med vanliga fel och ska komma med några egna frågor ...)

Kontrollera att HTML-kommentaren är riktigt formulerad. Syns koden eller delar av den i webbläsare eller som källkod, kolla att det finns "<!--#" (utan mellanslag) i början och " -->" (med mellanslag) i slutet.

/ används i "regular expressions" (reguljära uttryck) och " som avgränsare och tolkas som en del av kommandot om de inte föregås av \. Skriv alltså i stället \" resp \", så "skalas" \ bort!

Exempel:

<!--#if expr="\"sträng1\" = \"sträng2\"" -->
<!--#if expr="sträng1 = /sträng2/" -->
Den övre raden är sann endast om uttrycken är identiska (strängar inom \" jämförs)
Den undre är sann om sträng 2 återfinns i sträng1 /.../ avgränsar "reguljära uttryck".

Med %Y blir veckobaserat årtal fel, t ex den del av vecka 200201 som infaller under 2001 (31 dec - %Y%W ger vecka 200101! Lösning (enl man strftime:

   %G    Week-based year, including the century [0000,9999].
Valet %G fungera inte på webbservern!

Åter början

Utökad XSSI (XXSSI??, SSI+)

På Algonet har vi inte tillgång till exempelvis Hotwired: Random Directive, parse_form eller utökat #echo. Ej heller någon av: odbc, email, goto, label eller break som finns t ex i SSI+. Sökning på några av orden ger ett stort antal träffar!

Cache

Om man använder XSSI så att sidorna uppdateras ofta och det är viktigt att alltid aktuell sida visas kan man på dessa sidor lägga till uppgifter som förhindrar att sidan cachas. Detta eftersom .shtml-sidorna oftast behandlas som vanliga .html-sidor.

<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">

<META HTTP-EQUIV="Refresh" CONTENT="600;url=http://www.server.se/sida.shtml">
Den övre är föråldrad, den andra är standard. Använder man båda är man på säkra sidan.
Den tredje kan man använda om sidan uppdateras ofta; i klienten skrivs den om var 600 sekund!

Länkar

Med favoritsökmotorn finner man en massa länkar om man söker på (extended) server sides includes med lämpligt tillägg: tutorial, examples, reference etc.

Länkar till länksamlingar:
The CGI Resource Index, Yahoo Google sss Jigsaw SSI+
Exempel
The XSSI Library innehåller en mängd exempel och hänvisningar (se rubrikerna till vänster!) Tyvärr finns det flera döda länkar ...
The World's XSSI Cookbook innehåller rikligt med exempel.
SCAILAB XSSI Tutorial innehåller också exempel.

Åter början


Sidan besökt över 1000 gånger sedan 12 sep 2001.

Åter hemsidan

Se också sidor om:
Error robot   Skapa anpassade felmeddelanden (Bättre kolla fellogg)
Mailman   Program för e-postlistor Använder jag för nyhetsbrev  _Nytt!_
PHP   Tester med PHP på Algonet  
SSH   Secure shell - bättre än Telnet  
WAP   Grunder för att publicera för WAP-telefon  
Allmänt   Tekniska grunder Varför sidorna flyttats till Oderland & Co
    Titta gärna in hos Folkmusikhuset i Stockholm

Kontakta Arne Kjellman
arnek@sverige.nu

Uppdaterad 2004-07-28