# SSI - Server Side Includes

| Allgemeines zu Server Side Includes Übersicht bekannter Server Side Includes Arbeiten mit Variablen

## Allgemeines zu Server Side Includes

Mit Hilfe von Server Side Includes (auch unter der Abkürzung SSI bekannt) können Sie direkt innerhalb von HTML-Dateien dynamische Informationen, z.B. Datum und Uhrzeit, einbinden. Sie können auch CGI-Programme starten und deren Ausgaben, beispielsweise einen Zählerstand mit der Anzahl von Zugriffen auf die aktuelle Datei, in die HTML-Datei einbinden. Oder Sie geben den aktuellen Inhalt diverser CGI-Umgebungsvariablen direkt in HTML aus - ohne Umweg über ein separates CGI-Script. Server Side Includes sind generell dazu gedacht, kleinere Teile einer HTML-Seite dynamisch einzubinden.

Server Side Includes werden nur ausgeführt, wenn der Web-Browser die HTML-Datei über einen installierten Webserver aufruft, also mit einem URI vom Typ http://.... Voraussetzung ist ferner, dass der installierte Webserver die Server Side Includes unterstützt. Nicht alle Webserver tun das, andere interpretieren nur einen Teil der möglichen Angaben. Wenn der Server keine Server Side Includes kennt, funktionieren die entsprechenden Anweisungen in der HTML-Datei nicht. Beim Austesten mit einem lokal installierten Webserver lesen Sie hierzu bitte in der Dokumentation des Servers nach. Beim Einsatz auf einem öffentlichen Webserver fragen Sie Ihren Provider, ob dessen Webserver die Server Side Includes unterstützt.

Damit ein Webserver sofort erkennt, ob eine HTML-Datei SSI-Anweisungen enthält, ist es üblich, solche HTML-Dateien mit einer speziellen Dateinamenendung zu kennzeichnen. Gewöhnlich lauten die Dateiendungen .shtml, .shtm oder .sht. Die meisten Server ignorieren SSI-Anweisungen, wenn diese in einer gewöhnlichen HTML-Datei mit der Endung .htm oder .html stehen!

### Beispiel: Datei test1.shtml

Anzeigebeispiel: So sieht's aus (Zum Aufruf der Seite ist eine Internet-Verbindung erforderlich)

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <title>Dynamisches HTML mit Server Side Includes</title>
    </head>
    <body>
    <h1>Dynamisches HTML mit Server Side Includes</h1>
    Datum/Uhrzeit auf dem Server-Rechner:  <!--#config timefmt="%d.%m.%Y, %H.%M" -->
    <!--#echo var="DATE_LOCAL" --> Uhr<br>
    Name dieser HTML-Datei: <!--#echo var="DOCUMENT_NAME" --><br>
    Installierte Server-Software: <!--#echo var="SERVER_SOFTWARE" --><br>
    Ihr Web-Browser: <!--#echo var="HTTP_USER_AGENT" -->
    <h3>Weitere Informationen:</h3>
    <!--#exec cgi="/cgi-bin/plapper.pl" -->
    </body>
    </html>

### Beispiel: Datei plapper.pl

    #!/usr/bin/perl -w

    print "Content-type: text/html\n\n";
    print "<p>Aha, Sie haben das Script \"plapper.pl\" zusätzlich aufgerufen.<br>\n";
    print "Das ist nett von Ihnen, aber es plappert gar nicht sehr viel.</p>\n";

### Erläuterung:

Server Side Includes müssen Sie in einer HTML-Datei innerhalb eines Kommentars notieren. Es gibt verschiedene Server Side Include Anweisungen, beginnend mit einem Gatterzeichen `#`. Im obigen Beispiel kommen die Anweisungen `#echo` und `#exec` vor. Hinter der Anweisung folgt in der Regel eine Angabe der Art `Typ="Wert"`. Im Zusammenhang mit der Anweisung `#echo` ist beispielsweise die Angabe `var="Variablenname"` erlaubt, wobei "Variablenname" ein bestimmter, erlaubter Name sein muss. Es kann sich um Namen von CGI-Umgebungsvariablen handeln oder um spezielle Server Side Include Variablennamen (siehe Übersicht bekannter Server Side Includes weiter unten). Bei der Anweisung `#exec`, die ein Programm auf dem Server-Rechner ausführt, müssen Sie den Typ des Programms (im obigen Beispiel: `cgi`) und als Wert die Adresse des ausführbaren Programms (im obigen Beispiel: `"/cgi-bin/plapper.pl"`) angeben.

## Übersicht bekannter Server Side Includes

Die Tabelle ist nach Anweisungen alphabetisch sortiert.

Anweisung | Parameter/Wert | Beispiele
--- | --- | ---

`#config`

`errmsg="[Fehlermeldung]"`
`sizefmt="[Wert]"`
`timefmt="[Wert]"`

`errmsg` ist sinnvoll, um bei nicht anzeigbaren Server Side Includes eine verständliche Fehlermeldung auszugeben.

`sizefmt` bestimmt das Format für Dateigrößenangaben, z.B. sinnvoll vor dem Gebrauch von `#fsize`.

Erlaubte Werte:
`"abbrev"` (Dateigrößenangaben erfolgen in Kbyte).
`"bytes"` (Dateigrößenangaben erfolgen in Byte).

`timefmt` bestimmt das Ausgabeformat für Datum/Uhrzeit, z.B. sinnvoll vor dem Gebrauch von `#echo var="LOCAL_TIME"`.
Erlaubte Platzhalter:
`%a` = Wochentag kurz, z.B. sat
`%A` = Wochentag lang, z.B. Saturday
`%b` = Monat kurz, z.B. Apr
`%B` = Monat lang, z.B. April
`%d` = Tag im Monat 2stellig, z.B. 09
`%e` = Tag im Monat, z.B. 9
`%H` = Uhrzeit 24stündig, z.B. 15
`%I` = Uhrzeit 12stündig, z.B. 03
`%j` = julianisches Datum, z.B. 278
`%m` = Monat als Zahl, z.B. 05
`%M` = Minuten nach Stunde, z.B. 07
`%p` = bei%I: AM/PM, z.B. PM
`%S` = Sekunden, z.B. 01
`%U` = Kalenderwoche, z.B. 52
`%w` = n-ter Tag der Woche, z.B. 5
`%y` = Jahr 2stellig, z.B. 97
`%Y` = Jahr 4stellig, z.B. 1997
`%Z` = Zeitzone, z.B. MEZ

`<!--#config errmsg="SSI nicht anzeigbar!" -->`
`<!--#config sizefmt="bytes" -->`
`<!--#config timefmt="%d.%m.%Y, %H.%M" -->`

`#echo`

`var="[Variablenname]"`

Bei `[Variablenname]` sind CGI-Umgebungsvariablen erlaubt oder die folgenden speziellen Variablennamen:
`DOCUMENT_NAME` = Name der HTML-Datei
`DOCUMENT_URI` = Pfad der HTML-Datei
`LAST_MODIFIED` = Zeitstempel der HTML-Datei
`QUERY_STRING_UNESCAPED` = Unkodierter GET-Übergabestring
`DATE_LOCAL` = Datum/Uhrzeit nach Server
`DATE_GMT` (Datum/Uhrzeit nach Greenwich-Zeit
Außerdem können Sie selbst definierte Variablen einsetzen.

`<!--#echo var="SERVER_NAME" -->`
`<!--#echo var="DATE_LOCAL" -->`

`#exec`

`cmd="[Pfad/Programmdatei]"`
`cgi="[CGI-Pfad/CGI-Programm/Script]"`

Benutzen Sie `cmd`, um ein beliebiges Programm auf dem Server-Rechner zu starten.
Benutzen Sie `cgi`, um ein CGI-Programm/CGI-Script auf dem Server-Rechner auszuführen.
Es sollte sich um Programme handeln, die Daten auf die Standardausgabe schreiben. Diese Datenausgaben werden dann direkt in die HTML-Datei geschrieben.

`<!--#exec cmd="/prog/search.exe *.htm" -->`
`<!--#exec cgi="/cgi-bin/counter.pl" -->`

`#fsize` | `file="[Pfad/Datei]"` `virtual="[Pfad/Datei]"` Gibt die Größe der angegebenen Datei aus. Verwenden Sie `file` für Pfadangaben auf dem Server-Rechner relativ zur Datei mit SSI-Anweisungen und `virtual` für relative Pfadangaben bezogen auf das Wurzelverzeichnis für Dokumente des Webservers. | `<!--#fsize virtual="/download/selfhtml.zip" -->`
`#flastmod` | `file="[Pfad/Datei]"` `virtual="[Pfad/Datei]"` Gibt den Zeitstempel der angegebenen Datei aus. Verwenden Sie `file` für Pfadangaben auf dem Server-Rechner relativ zur Datei mit SSI-Anweisungen und `virtual` für relative Pfadangaben bezogen auf das Wurzelverzeichnis für Dokumente des Webservers. | `<!--#flastmod file="index.htm" -->`

`#include`

`file="[Pfad/Datei]"`
`virtual="[Pfad/Datei]"`

Gibt den Inhalt der angegebenen Datei aus.

Verwenden Sie `file` für absolute Pfadangaben auf dem Server-Rechner und `virtual` für relative Pfadangaben bezogen auf das Wurzelverzeichnis für Dokumente des Webservers. In Falle von `file` können Sie nur Dateien angeben, die im selben Verzeichnis oder in Unterverzeichnissen liegen. Bei `virtual` gibt es diese Begrenzung nicht, da die Angabe auf eine beliebige (zugängliche) Adresse auf dem Server hinweisen kann.

`<!--#include virtual="/news/news.htm" -->`

### Beachten Sie:

Findet der Webserver eine SSI-Anweisung, die er ausführen kann, so wird anstelle dieser Anweisung der angeforderte Code in das HTML-Dokument eingebunden. Wenn Sie nun mit
`<!--#include file="datei.htm" -->`
ein vollständiges HTML-Dokument einbinden, kann es Ihnen passieren, dass die "resultierende" Webseite plötzlich z.B. über mehrere Kopf-Bereiche verfügt und nicht mehr valides HTML ist. Verschiedene Browser können dadurch Anzeigeprobleme bekommen. Sie können das vermeiden, indem Sie in Ihrem *.shtml-Dokument lediglich den Code notieren, der letztlich im `head`- oder im `body`-Element eingefügt werden soll. Solche Dateien mit HTML-Schnipseln bekommen üblicherweise die Dateinamenserweiterung inc (für include), also beispielsweise dateiname.inc. Solche `inc`-Dateien sollten reine Textdateien sein und dürfen beliebigen HTML-Code enthalten - je nachdem, an welcher Stelle einer HTML-Datei Sie den Codeschnipsel einbinden möchten. Wenn Sie beispielsweise die Include-Anweisung `<!--#include virtual="/includes/navigation.inc" -->` im `body`-Element, also zwischen `<body>` und `</body>` notieren, kann navigation.inc denjenigen HTML-Code enthalten, der als `body`-Inhalt erlaubt ist. Wenn Sie in dieser Datei wieder SSI-Anweisungen unterbringen wollen, müssen Sie allerdings die Dateiendung .shtml verwenden.

Sie können beliebig viele SSI-Anweisungen in einer *.shtml-Datei notieren. Der Webserver setzt aus den angeforderten Daten ein neues HTML-Dokument zusammen und der Benutzer, der Ihr *.shtml-Dokument in seinem Browser aufruft, erfährt nichts davon, wie es zusammengesetzt wurde. Gehen Sie daher mit der Include-Anweisung sorgsam um. Wenn Sie sehr viele HTML-Codeschnipsel auf diese Weise einbinden, wird das resultierende HTML-Dokument unter Umständen sehr groß.

## Arbeiten mit Variablen

Mit SSI können Sie noch wesentlich mehr anstellen als oben beschrieben. Sie haben an der Bezeichnung `var` weiter oben bereits ablesen können, dass Sie Variablen verwenden dürfen. Selbstverständlich können Sie anstelle von festgelegten Umgebungsvariablen wie `SERVER_NAME` oder `DATE_LOCAL` auch eigene Variablen definieren. Das Apache-Modul `mod_include`, das die Ausführung von SSI überhaupt erst ermöglicht, stellt dafür so etwas wie eine winzige Programmiersprache zur Verfügung. So können Sie beispielsweise mit
`<!--#set var="name" value="Wert" -->`
einer Variablen einen beliebigen Namen geben und ihr einen beliebigen Wert zuweisen. Es ist ebenfalls möglich, mit einfachen `if/else`-Festlegungen Bedingungen zu formulieren, die für das Ausführen bestimmter Server Side Includes zutreffen sollen.

### Beispiel: Datei test2.shtml

Anzeigebeispiel 1: So sieht's aus (ohne Übergabeparameter) (Zum Aufruf der Seite ist eine Internet-Verbindung erforderlich)
Anzeigebeispiel 2: So sieht's aus (mit Übergabeparameter) (Zum Aufruf der Seite ist eine Internet-Verbindung erforderlich)

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <title>Dynamisches HTML mit Server Side Includes</title>
    </head>
    <body>
    <h1>Dynamisches HTML mit Server Side Includes</h1>
    <p>Diese Seite hat keine festgelegten Inhalte, sondern wird vom Server zusammengesetzt.<p>
    <!--#if expr="$QUERY_STRING = /test/" -->
    <!--#set var="param" value="Sie haben die Seite mit dem test-Parameter aufgerufen" -->
    <!--#echo var="param" -->
    <!--#else -->
    <!--#include virtual="test.inc" -->
    <!--#endif -->
    </body>
    </html>

### Beispiel: Datei test.inc

    <p>Auf einer Meierei,<br>
    da lebte einst ein braves Huhn,<br>
    das legte, wie die Hühner tun,<br>
    an jedem Tag ein Ei.<br>
    Und kakelte, mirakelte, spektakelte,<br>
    als obs ein Wunder sei.</p>

### Erläuterung:

Die Beispieldatei test2.shtml enthält insgesamt sechs Zeilen mit SSI-Anweisungen.
In der ersten Anweisung fragen Sie ab, ob der aufgerufenen URL ein Parameter in der Form ?test mitgegeben wurde. Den Namen dieses Parameters müssen Sie innerhalb der SSI-Anweisung selbst in Slashes (Schrägstriche) einfassen, was ungefähr dem entspricht, was Sie von Perl als regulären Ausdruck kennen.
Trifft dies zu, werden die anderen Anweisungen bis <!--#else --> befolgt. Das bedeutet: in der zweiten Anweisung wird der Variablenname `param` festgelegt, die Variable erhält gleichzeitig einen String (den Satz:"Sie haben die Seite mit dem test-Parameter aufgerufen") als Wert zugewiesen und in der dritten Anweisung geben Sie mit `echo` (auch wieder ähnlich dem Perl-Befehl) den Wert der Variablen `param` am Bildschirm aus.
Trifft dies nicht zu (haben Sie also keinen Parameter an die URL angehängt), so werden die zweite und dritte Anweisung ignoriert.
Die vierte Anweisung legt fest, dass es eine Alternative geben soll, falls Sie die URL nicht mit einem zusätzlichen Parameter aufgerufen haben.
Die fünfte Anweisung veranlasst den Webserver, an dieser Stelle den gesamten Inhalt der Datei test.inc einzubinden, falls nicht zuvor in den "if"-Zweig gewechselt worden war.
Mit der letzten Zeile wird die if/else-Bedingung beendet. Eine solche abschließende Zeile müssen Sie immer angeben, wenn Sie mit solchen bedingten Anweisungen arbeiten möchten.

Mit dem Einsatz von if/else-Bedingungen und Variablen in SSI-Anweisungen können Sie die Erscheinungsweise Ihrer Webseite auf vielfältige Weise variieren. Beispielsweise können Sie von Übergabe-Parametern abhängig machen, ob bestimmte Links angezeigt oder ganze Textblöcke überhaupt in die Seite aufgenommen werden sollen. Sie können mehrere Parameter miteinander kombinieren und sich damit ein dynamisches Navigationsmenü zusammenstellen. Sie können den anzuzeigenden Inhalt komplett austauschen lassen usw.

Server Side Includes stellen keine Alternative zu dem dar, was Scriptsprachen wie Perl oder PHP an Möglichkeiten anbieten. Mit SSI können Sie bestehende Dateien nicht verändern, Sie können nichts speichern, nur in geringem Umfang Formulardaten berücksichtigen, keine Berechnungen ausführen lassen und vieles weitere. Aber für die "dynamische" Zusammenstellung von Seiteninhalten bieten SSI einige großartige Perspektiven an, und Sie müssen sich nicht erst mit den oftmals komplexen Programmiertechniken der "großen" Scriptsprachen befassen.

| .htaccess - Server-Reaktionen kontrollieren
| Der Apache HTTP-Webserver

© 2007 Impressum