6.6.2. Struktur der Anweisung
Die SSI-Direktiven, die in die HTML-Seiten eingefügt werden müssen, haben die folgende allgemeine Syntax:

      <!--#element attribute=value  attribute=value ... -->

Sollte das SSI-Modul nicht aktiviert sein, stellt der Browser nur den Kommentar dar.
6.6.2.1. Basisanweisungen
Für den Platzhalter "element" sind folgende Werte möglich:

Element
Beschreibung
config
Festlegung des Ausgabeformats
echo
Ausgabe von Variablen
exec
Aufruf eines externe Programms (cgi oder Systemaufruf)
fsize
Ausgabe der Dateigröße
flastmod
Ausgabe des Datums der letzten Änderung
include
Einbindung einer Datei
printenv
Darstellung aller Variablen
set
Variable einen Wert zuweisen
6.6.2.1.1 config
Das config Element kontrolliert im wesentlichen drei Aspekte:

  • errmsg: Die Fehlermeldung, die bei Fehlern ausgegeben wird
  • sizefmt: Format von Größenangaben (bytes, kB, MB)
  • timefmt: Format von Datumsangaben (im "strftime"-Format)

Beispiele:

     <!--#config errmsg="[It appears that you don't know how to use SSI]" -->
     <!--#config timefmt="%A %B %d, %Y" -->
6.6.2.1.2 echo
Das echo-Element gibt den Wert einer Variablen aus. Der Befehl erwartet bis zu zwei Attribute:

  • encoding:     der Umgang mit Sonderzeichen
  • var:              die dazustellende Variable

Beispiel:

     <!--#echo var="DATE_LOCAL" -->
6.6.2.1.3 exec
Das exec-Element führt ein externe Programm aus und fügt dessen Output in die Seite ein. Es erfordert das Module "mod_cgi". Das Kommando kann mit der "Option IncludesNOEXEC" deaktiviert werden.

Als Argument erwartet das Element das Attribut "cgi" oder "cmd" mit dem urlencodeden Pfad des Programms. Im Fall des "cgi" wird der relative Pfad des CGIs angegeben.

Beispiel:

     <!--#exec cgi="/cgi-bin/example.cgi" -->

Beim Attribut "cmd" wird eine Subshell (/bin/sh, command.com) aufgerufen und das Programm abgearbeitet.

Beispiel:

     <!--#exec cmd="ls" -->
     <!--#exec cmd="perl /path/to/perlscript arg1 arg2" -->


Die Parameter der HTML-Seite werden per PATH_INFO an das Programm übergeben. Sollten aber noch weitere Parameter nötig sein, sollte man dem exec-Element das "include virtual"- Element vorziehen. Auch die interne Verarbeitung ist beim "include" effektiver implementiert.

6.6.2.1.4 fsize
Das fsize-Element gibt die Größe des jeweiligen Files wieder. Das Element unterstützt zwei Attribute:

  • file:         eine Datei
  • virtual:    dynamische Datei - Größe des Outputs (Content-Length)
6.6.2.1.5 flastmod
Dieses Element (flastmod) gibt das Datum der letzten Veränderung. Das Element unterstützt zwei Attribute:

  • file:         eine Datei
  • virtual:    dynamische Datei

Beispiel:

     <!--#config timefmt="%A %B %d, %Y" -->
     This file last modified <!--#flastmod file="ssi.shtml" -->
6.6.2.1.6 include
Das include-Element fügt den Text eines anderen Dokuments (statisch oder dynamisch) an der Stelle ein. Die Zugriffsbegrenzungen sind dabei aber aktiv. Als Attribute sind möglich:

  • file:         einzubindende Datei (nur Dokumente, die unterhalb des aktuellen Verzeichnisses liegen können eingebunden werden, nicht absolut oder mit "..")
  • virtual:    urlencodeder Pfad zum Dokument (ohne http oder Hostname). [empfohlen]

Im Fall der virtuellen Dokumente wird das Programm behandelt, als wenn es ein Client aufrufen würde, d.h. z.B. ScriptAlias-Direktiven oder Redirects werden abgearbeitet. Auf diesem Weg können mehrere Includes kaskadiert werden.

Beispiel:

     <!--#include virtual="/footer.html" -->
     <!--#include virtual="/cgi-bin/counter.pl" -->
     <!--#include virtual="/cgi-bin/example.cgi?argument=value" -->
6.6.2.1.7 printenv
Das printenv-Element listet alle bestehenden Variablen auf. Sonderzeichen werden codiert.

Beispiel:

     <!--#printenv -->
6.6.2.1.8 set
Mit dem set-Element weist man einer Variable einen Wert zu. Die beiden Attribute sind

  • var:         der Name der Variablen
  • value:     der Wert

Beispiel:

     <!--#set var="category" value="help" -->
     
6.6.2.2. Variablen
Neben den Standard-CGI-Variablen stehen dem SSI zusätzlich die folgenden Variablen zur Verfügung:

Variable
Beschreibung
DATE_GMT
Datum GMT
DATE_LOCAL
lokales Datum
DOCUMENT_NAME
Filename des angefragten Dokuments
DOCUMENT_URI
die vollständige URL des Dokuments
LAST_MODIFIED
Last-Modified des Ursprungsdokuments
QUERY_STRING_UNESCAPED
URL-decodeder Query-String (aber mit \& escapetete &- Zeichen)

Wenn Variablennamen ersetzt werden sollen (außer bei echo), muss dem Namen ein "$" vorweg geschrieben werden. Typischerweise ist die Variable in Anführungszeichen eingebunden. Wenn die Variable vom umgebenden String abgegrenzt werden soll, muss der Variablenname in geschweifte Klammern eingeschlossen werden.

Einige Beispiele:

     <!--#if expr="$a = \$test" -->
     <!--#set var="Zed" value="${REMOTE_HOST}_${REQUEST_METHOD}" -->

     
6.6.2.3. Ablaufkontrolle
Die grundlegenden Elemente zur Ablaufkontrolle sind

     <!--#if expr="test_condition" -->
     <!--#elif expr="test_condition" -->
     <!--#else -->
     <!--#endif -->

Die If-Anweisungen entsprechen denen von Programmiersprachen. Die Test-Bedingungen werden bewertet und wenn sie "wahr" sind, wird der nachfolgende Text bis zum nächsten "endif" oder "elif" ausgegeben. Folgende Tests werden unterstützt:

Test
Beschreibung
string
wahr, wenn nicht leer
string1=string2
Gleichheit
string1!=string2
Ungleichheit
string1[!]=/string2/
Gleichheit/Ungleichheit, wobei string2 ein perl-Regexp ist.
Trick: wenn auf Gleichheit getestet wird, werden die Variablen $1...$9 belegt. Z.B.:
    <!--#if expr="$QUERY_STRING = /^sid=([a-zA-Z0-9]+)/" -->
        <!--#set var="session" value="$1" -->
    <!--#endif -->
string1 < string2
string1 <= string2
string1  > string2
string1 >= string2
Vergleich auf "kleiner", "kleiner gleich", "größer", "größer gleich". Es sind aber Vergleiche von Zeichenketten, d.h "100" ist kleiner als "20"
( test_condition )
wahr, wenn Testbedingung wahr ist
! test_condition
"nicht" Bedingung
test1 && test2
Test 1 UND Test 2
test1 || test2
Test 1 ODER Test2

Strings können mit Anführungszeichen gruppiert werden (da sonst Whitespaces Probleme bereiten).

Ein Beispiel:

     <!--#if expr='"$DOCUMENT_URI" = "/foo/file.html"' -->
          URI ist foo
     <!--#elif expr='"$DOCUMENT_URI" = "/bar/file.html"' -->
          URI ist bar
     <!--#else -->
          weder noch
     <!--#endif -->