Server Side Includes

Gelesen bei AboutWebDesign.de
URL: http://www.aboutwebdesign.de/awd/content/971543957.shtml

Bisher war es immer so, dass Sie Ihre Seiten auf den Server geladen haben, der dann nichts weiter tat, als die Seiten an Ihre Benutzer auszuliefern. Inzwischen setzt sich jedoch eine neue, außerordentlich praktische Technologie bei den meisten Web-Hostern durch: Server Side Includes. Das sind ein paar relativ einfache Befehle, die der Server ausführt, bevor die Seite an den Surfer geliefert wird.

Voraussetzungen

Ihr Server muss Server Side Includes unterstützen, und die Dateien, in denen SSI stehen, sollten auf ".shtml" enden. Diese Dateiendung signalisiert nämlich dem "Parser" des Servers, dass hier Server Side Includes sind, die auf Verarbeitung warten.

Grundsätzliches

SSI beginnen immer mit <!--# und enden mit -->. Vor --> muss entweder ein Anführungszeichen oder ein Leerzeichen stehen.

Andere Datei einfügen

Der für Webmaster absolute Top-Hit unter den Server Side Includes: mit diesem Befehl fügt der Server dort, wo der Befehl steht, den Inhalt einer anderen Datei ein. Praktisch wird dies bei z.B. Navigationsmenüs. Fügen Sie in jede Ihrer Dateien einen Befehl ein, der eine Datei, in der Ihr Navigationsmenü als HTML-Code gespeichert ist, einschließt. Hinterher brauchen Sie nur diese eine eingeschlossene Datei zu ändern, um das Aussehen des Navigationsmenüs durchgehend anzupassen.

Beispiel:

<!--#include virtual="/verz1/index.html"-->

Dieser Befehl fügt die Datei "http://www.IhrServer.de/verz1/index.html" ein. Wichtig ist hier das Schlüsselwort "virtual": dadurch wird es nämlich möglich, Dateinamen sowohl relativ als auch absolut anzugeben.

Ein Beispiel: Ihr Server heißt "http://www.xyz.de", das obige Beispiel liegt in der Datei "http://www.xyz.de/verzeichnis2/index.shtml".

Wie sich ein absoluter Befehl auswirkt, steht direkt unter dem Beispiel. Was ist nun aber, wenn wir den Befehl relativ anwenden, also ohne den "/" am Anfang?

Der Befehl

<!--#include virtual="verz1/index.html"-->

fügt die Datei "http://www.xyz.de/verzeichnis2/verz1/index.html" ein. Bei relativen Befehlen wird also von der Position der Datei ausgegangen, in der der Befehl steht, bei absoluten wird grundsätzlich vom "root", also vom Stammverzeichnis Ihres Webservers, ausgegangen.

Dateigrößen

Dieser Befehl zeigt die Dateigröße der Datei "/verz1/index.html" an:

<!--#fsize file="/verz1/index.html"-->

CGI-Script ausführen

Der folgende Befehl führt das CGI-Script "acup.pl" aus. Das, was das Script an die Standardausgabe sendet, landet hinterher da, wo der exec-Befehl stand.

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

Bitte beachten Sie, dass sich CGI-Scripts auch mit dem Include-Befehl ausführen lassen.
<!--#include virtual="/cgi-bin/acup.pl"--> würde also auch funktionieren und ist meistens sogar unproblematischer.

Letzte Änderung

Mit dieser Anweisung wird die letzte Dateiänderung angezeigt:

<!--#flastmod file="/verz1/index.shtml"-->

Setzen einer Variablen

Es ist möglich, mit SSI Variablen Werte zuzuweisen:

<!--#set var="Variablenname" value="Wert" -->

Ausgabe einer Variable

Es gibt verschiedene sogenannte "Variablen", die ausgegeben werden können. Im Beispiel heißt die auszugebende Variable "DOCUMENT NAME":

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

Folgende Variablen sind vordefiniert:

DATE_GMT (Datum u. Uhrzeit, GMT)
DATE_LOCAL (Datum u. Uhrzeit, lokale Server-Zeit)
DOCUMENT_NAME (Name der Datei, in der der Befehl steht)
DOCUMENT_URI (Pfad zu der Datei, in der der Befehl steht)
LAST_MODIFIED (Letzte Dateiänderung)
QUERY_STRING (übergebene Argumente)

Letztere Option ist sehr praktisch: wenn Sie z.B. "http://www.IhrServer.de/test.shtml?teststring" aufrufen, dann enthält QUERY_STRING den Wert "teststring". Zusammen mit den logischen Ausdrücken (siehe unten) lassen sich damit sehr praktische Dinge anfangen.

An dieser Stelle ein kleines Beispiel für eine dynamische Inhaltserzeugung unter Verwendung von QUERY_STRING:

<!--#if expr="${QUERY_STRING} != 'moreinfo'" -->
Sehr schöne Informationen über Thema ABC
<a href="<!--#echo var="DOCUMENT_URI"-->?moreinfo">
Mehr Informationen
<!--#endif -->

<!--#if expr="${QUERY_STRING} = 'moreinfo'" -->
Mehr Informationen über Thema ABC
<!--#endif -->


Konfiguration der Datumsausgabe

Gut möglich, dass Sie die Art und Weise, wie das Datum z.B. in der Variable "DATE_GMT" gespeichert wird, gerne ändern möchten. Verwenden Sie dazu diesen Befehl:

<!--#config timefmt="%d.%m.%Y"-->

In der Config-Angabe werden bestimmte, mit "%" beginnende Zeichenfolgen z.B. durch den aktuellen Tag oder das aktuelle Jahr ersetzt. Diese "%"-Codes gibt es:

%y = Jahr (2 Stellen), z.B. 01
%Y = Jahr (ausgeschrieben), z.B. 2001

%b = Monatsname (Abkürzung), z.B. Apr
%B = Monatsname (ausgeschrieben), z.B. April
%m = Monat als Zahl, z.B. 04

%U = Kalenderwoche, z.B. 14
%w = x-ter Tag der aktuellen Woche, z.B. 2
%a = Wochentag (Abkürzung), z.B. mon
%A = Wochentag (ausgeschrieben), z.B. Monday

%d = Tag des Monats (immer zweistellig), z.B. 05
%e = Tag des Monats (bis 9 einstellig), z.B. 5

%H = Uhrzeit (24 Stunden), z.B. 20
%I = Uhrzeit (12 Stunden), z.B. 08
%M = Minuten, z.B. 08
%S = Sekunden, z.B. 24
%p = (nur bei Verwendung von %I) AM oder PM, z.B. AM

%Z = Eingestellte Zeitzone, z.B. GMT

Abfragen

Ein Beispiel für Abfragen haben Sie bereits unter dem Abschnitt "Ausgabe einer Variable" gesehen. Damit wird dynamische Inhaltserzeugung ohne Verwendung von serverseitigen Programmen möglich.

Dabei werden die Ausdrücke if, elif, else und endif unterstützt, mit folgender Bedeutung:
if expr = "bedingung"
elif expr = "bedingung"
else
endif

Zur Bedeutung von "bedingung" weiter unten mehr. Zunächst ist es wichtig, zu verstehen, dass sich damit logische Strukturen aufbauen lassen. if leitet grundsätzlich eine Abfrage ein. Folgen muss eine Bedingung. Normalsprachlich würde man "Wenn xyz zutrifft, dann..."" sagen.

elif verlangt ebenfalls eine folgende Bedingung, man würde aber normalsprachlich "Wenn vorheriges nicht zutrifft, aber xyz, dann..." sagen. elif kann also nur nach einem if oder einem anderen elif stehen.

else dagegen steht für "wenn alles andere nicht zutrifft, dann...". else kann nur nach einem if oder elif stehen.

endif markiert das Ende der Abfrage.

Zunächst also ein Beispiel für eine mögliche Abfrage:

<!--#if expr = "'abc' = 'bcd'" -->
Wird nur angezeigt, wenn "abc" gleich "bcd" ist
<!--#elif expr = "'abc2' = 'abc1'" -->
Wird nur angezeigt, wenn "abc2" gleich "abc1" ist
<!--#else -->
Nur, wenn gar nichts zutrifft.
<!--endif -->


Verschachtelungen sind möglich:

<!--#if expr = "'abc' = 'abc'" -->
Wird nur angezeigt, wenn "abc" gleich "abc" ist
    <!--#if expr = "'abc2' = 'abc2'" -->
    Und das hier auch
    <!--endif -->
<!--endif -->


Kommen wir nun zur Bedingung. Wie in den Beispielen zu sehen ist, wird die Bedingung von Anführungszeichen umschlossen. Ein Leerzeichen nach dem Anführungszeichen ist empfehlenswert.

Bedingungen werden immer nach 0 (nicht zutreffend) oder 1 (zutreffend) hin ausgewertet. if und elif werden nur dann wirksam, wenn das Ergebnis eine 1 ist.

Die Bedingung setzt sich typischerweise aus drei Teilen zusammen: einem Operator in der Mitte und zwei Seiten, rechts und links daneben:

'zeichenkette1' = 'zeichenkette2'

Folgende Operatoren gibt es: = (gleich), != (ungleich), < (kleiner), > (größer), <= (kleiner oder gleich), >= (größer oder gleich).

Hat man mehrere Teilbedingungen, die überprüft werden sollen, dann verwendet man && (und) und || (oder). Üblicherweise wird dann geklammert:

('zeichenkette1' = 'zeichenkette2') && ('abc' != 'abc')

Will man eine Bedingung umkehren, verwendet man !:

!('zeichenkette1' = 'zeichenkette2')

Es ist auch möglich, eine Variable auszuwerten. Ihr Name steht dann innerhalb von ${}

<!--#if expr="${QUERY_STRING} = 'moreinfo'" -->

Für Fortgeschrittene gibt es dann noch die Möglichkeit der regulären Ausdrücke (eine Erklärung würde weit über den Umfang dieses Artikels hinausgehen). So testen Sie z.B., ob die Variable die Zeichenkette "test" enthält:

<!--#if expr="${DOCUMENT_URI} = /test/" -->
DOCUMENT_URI enthält "test"
<!--#endif -->


Alle Umgebungsvariablen ausgeben

Praktisch für Debugging-Zwecke ist die Ausgabe aller Umgebungsvariablen:

<!--#printenv-->