|
|
|
4.9 SSI
|
|
|
|
|
4.9.1
Einführung
Vor einigen Jahren war die Aktualisierung eines Navigationsmenüs richtige Arbeit, wenn man nicht gerade einen Server mit CGI-Unterstützung zur Verfügung hatte oder Frames verwendete. Das ist vorbei, denn heute sind Server Side Includes auch bei den Massen-Hostern verfügbar. Dabei handelt es sich um relativ einfache Befehle, die der Server ausführt, bevor die Seite an den Surfer geliefert wird.
|
|
|
4.9.2
Voraussetzungen
4.9.2.1 Auf dem Server
Server Side Includes (SSI) werden erst auf einem entsprechend ausgestatteten Web-Server aktiv. Wenn Sie die Dateien also einfach von der Festplatte in Ihren Browser laden, wird nichts zu sehen sein. Sie brauchen folglich einen Server, der SSI unterstützt.
Wenn Sie sowieso Webspace gemietet haben, sollte das kein Problem sein: fast alle großen deutschen Hoster unterstützen SSI. Wenn Sie dagegen keinen Webspace haben, können Sie sich auch einen Webserver lokal installieren, so z.B. den Apache. Herunterladen kann man sich den populären Server von apache.org.
Die meisten Server entscheiden anhand der Dateiendung, ob sie ihren SSI-Parser aktivieren sollen. Meist ist das .shtml, im Zweifelsfall wird Ihnen der Administrator des Servers sicher weiterhelfen können.
4.9.2.2 Auf dem eigenen Computer
Nahezu wie immer: ein Text-Editor reicht vollkommen aus.
|
|
|
4.9.3
SSI-Syntax
SSI-Anweisungen beginnen immer mit <!--# und enden mit -->. Vor --> muss entweder ein Anführungszeichen oder ein Leerzeichen stehen.
Hinter der Raute steht der eigentliche Befehl. Nach einem Leerzeichen können dann weitere Parameter folgen, die die Wirkung des Befehls beeinflussen.
Beispiel (der Befehl existiert nicht): <!--#Telefonanruf nummer="245218"-->
|
|
|
4.9.4
Einfügen einer Datei
Eine der beliebtesten Anweisungen: mit dem include-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 Slash 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.
|
|
|
4.9.5
Dateigrößen
Dieser Befehl zeigt die Dateigröße der Datei /verz1/index.html an:
<!--#fsize file="/verz1/index.html"-->
|
|
|
4.9.6
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 fast immer auch mit dem include-Befehl ausführen lassen.<!--#include virtual="/cgi-bin/acup.pl"--> würde also auch funktionieren und ist meistens sogar unproblematischer.
|
|
|
4.9.7
Letzte Änderung
Mit dieser Anweisung wird die letzte Dateiänderung angezeigt:
<!--#flastmod file="/verz1/index.shtml"-->
|
|
|
4.9.8
Variablen
Variablen sind Container für Daten. Jeder Container trägt einen Namen. Es ist möglich, im Laufe eines Container-Lebens unterschiedliche Inhalte in den Container einzusetzen.
4.9.8.1 Setzen
Neben den von Anfang an vordefinierten Variablen kann man auch selbst Variablen setzen:
<!--#set var="Variablenname" value="Wert" -->
4.9.8.2 Ausgeben
Das nächste Beispiel zeigt das Ausgeben einer Variable. "Ausgeben" heißt, dass die entsprechende SSI-Anweisung durch die in der Variable enthaltene Information ersetzt wird. Im Beispiel heißt die auszugebende Variable DOCUMENT_NAME:
<!--#echo var="DOCUMENT_NAME"-->
4.9.8.2.1 Vordefinierte Variablen
Folgende Variablen sind vordefiniert, müssen also nicht gesetzt werden und enthalten grundsätzlich sinnvolle Werte:
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)
4.9.8.2.2 Besonderheit von QUERY_STRING
Letztere Variable ist sehr praktisch: wenn z.B. http://www.IhrServer.de/test.shtml?teststring aufgerufen wird, dann enthält QUERY_STRING den Wert teststring. Zusammen mit den logischen Ausdrücken (siehe unten) lassen sich damit sehr praktische Dinge anfangen.
Um das zu verdeutlichen, an dieser Stelle ein kleines Beispiel für eine dynamische Inhaltserzeugung unter Verwendung von QUERY_STRING. Es geht dabei darum, dass der Benutzer auf einen Link klickt und mehr Informationen angezeigt bekommt. Wenn Sie das Beispiel jetzt noch nicht verstehen, macht das nichts - lesen Sie zunächst weiter bis zu den Abfragen und kehren Sie dann hierher zurück.
<!--#if expr="${QUERY_STRING} != 'moreinfo'" -->
Sehr schöne Informationen über Thema ABC
<a href="<!--#echo var="DOCUMENT_URI"-->?moreinfo">
Mehr Informationen</a>
<!--#endif -->
<!--#if expr="${QUERY_STRING} = 'moreinfo'" -->
Mehr Informationen über Thema ABC
<!--#endif -->
4.9.8.2.3 DATE_GMT verändern
Gut möglich, dass Sie die Art und Weise, wie das Datum z.B. in der Variablen DATE_GMT gespeichert wird, gerne ändern möchten. Verwenden Sie dazu diesen Befehl:
<!--#config timefmt="%d.%m.%Y"-->
Das, was über den Parameter timefmt übergeben wird, bestimmt letztendlich, was in DATE_GMT steht. Innerhalb von timefmt stehende, mit dem Prozent-Zeichen beginnende Formatierungs-Codes werden später durch konkrete Werte 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
|
|
|
4.9.9
Abfragen
Ein Beispiel für Abfragen haben Sie bereits unter dem Abschnitt "Ausgabe einer Variable" gesehen. Damit wird dynamische Inhaltserzeugung ohne Verwendung von speziellen serverseitigen Programmen möglich.
4.9.9.1 Struktur von Abfragen
Für Abfragen werden die Schlüsselwörter if, elif, else und endif unterstützt:
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 die Bedingung zutrifft, dann..."" sagen.
elif verlangt ebenfalls eine folgende Bedingung, man würde aber normalsprachlich "Wenn vorheriges nicht zutrifft, aber eine andere Bedingung, 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 nur dann, wenn "abc" gleich "abc" ist und
"abc2" zusätzlich noch gleich "abc2"
<!--endif -->
<!--endif -->
4.9.9.2 Bedingungen
Kommen wir nun zur Bedingung. Wie in den Beispielen zu sehen ist, wird die Bedingung von Anführungszeichen umschlossen. Ein Leerzeichen nach dem schließenden Anführungszeichen ist empfehlenswert.
Bedingungen werden immer nach 0 (nicht zutreffend) oder 1 (zutreffend) hin ausgewertet. if und elif verarbeiten nur dann den nachfolgenden Code, wenn das Ergebnis eine 1 ist.
Die Bedingung setzt sich typischerweise aus drei Teilen zusammen: einem Operator in der Mitte und zwei Operanden, 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')
(In natürlicher Sprache: "Wenn 'Zeichenkette1' gleich 'Zeichenkette2' und 'abc' ungleich 'abc'")
Will man eine Bedingung umkehren, verwendet man !:
!('zeichenkette1' = 'zeichenkette2')
(In natürlicher Sprache: "Wenn nicht 'Zeichenkette1' gleich 'Zeichenkette2'")
Es ist auch möglich, eine Variable in eine Abfrage mit einzubeziehen. Ihr Name steht dann innerhalb von ${}
<!--#if expr="${QUERY_STRING} = 'moreinfo'" -->
("Wenn der Inhalt der Variable QUERY_STRING gleich 'moreinfo' ist")
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 -->
|
|
|
4.9.10
Debugging-Tipp
Wer Probleme mit komplexen SSI hat, muss oft wissen, welche Variablen welchen Wert haben. Eine bequeme Ausgabe aller Variablen erledigt folgendes Code-Stück:
<!--#printenv-->
|
|
|
|