Praxis / Anleitungen Apache-Tutorial: Einführung Server-Side Includes

Mit Server-Side Includes kann vorhandenen HTML-Dokumenten dynamisch Inhalt hinzugefügt werden.

Was sind Server-Side Includes?

Server-Side Includes sind Direktiven, die in HTML-Seiten gesetzt und bei der Bearbeitung der Anfrage vom Server ausgewertet werden. Mit ihnen kann dynamisch erzeugter Inhalt in eine vorhandene HTML-Seite eingefügt werden, ohne dass die gesamte Seite über ein CGI-Programm oder andere dynamische Techniken ausgeliefert werden muss.

Ob Server-Side Includes verwendet werden und wann Seiten vollständig von einem Programm generiert werden sollten, hängt in der Regel davon ab, wieviel des Seiteninhalts statisch ist und wieviel des Inhalts bei jeder Auslieferung der Seite neu ermittelt werden muss. Server-Side Includes eignen sich hervorragend zum Einfügen kleinerer Informationsmengen (zum Beispiel der Uhrzeit), muss aber der größte Teil einer Seite bei ihrer Auslieferung generiert werden, sollte nach anderen Lösungen gesucht werden.

Den Server für SSI konfigurieren

Damit der Server SSI-Direktiven verarbeiten kann, muss die folgende Direktive entweder in die httpd.conf-Datei oder in eine .htaccess-Datei eingefügt werden:

Options +Includes

Diese Direktive teilt dem Apache mit, dass Dateien auf SSI-Direktiven hin untersucht werden sollen. Beachten Sie, dass in den meisten Fällen mehrere Options-Direktiven vorhanden sind, die sich gegenseitig überschreiben können. Möglicherweise muss die Options-Direktive für ein bestimmtes SSI-Verzeichnis angewendet werden, damit sie am Schluss ausgewertet wird.

Es wird nicht jede Datei auf SSI-Direktiven untersucht. Sie müssen dem Apache mitteilen, welche Dateien untersucht werden sollen. Das kann auf zwei Arten geschehen. Mit den folgenden Direktiven können Sie den Server anweisen, jede Datei mit einer bestimmten Dateinamenserweiterung wie zum Beispiel .shtml zu untersuchen:

AddType text/html .shtml
AddOutputFilter INCLUDES .shtml

Diese Vorgehensweise hat bei vorhandenen Dateien, in die SSI-Direktiven eingefügt werden sollen, den Nachteil, dass der Dateiname sowie alle Links zu dieser Seite geändert werden müssen.

Die andere Möglichkeit ist die Verwendung der XBitHack-Direktive:

XBitHack on

Die XBitHack-Direktive weist den Apache an, Dateien auf SSI-Direktiven zu untersuchen, wenn das Ausführungsbit gesetzt ist. Werden einer vorhandenen Seite SSI-Direktiven hinzugefügt, muss in diesem Fall nicht der Dateiname geändert, sondern die Datei mit chmod als ausführbar gekennzeichnet werden.

chmod +x pagename.html

Ein kurzer Hinweis dazu, was Sie nicht tun sollten. Manchmal wird empfohlen, den Apache anzuweisen, alle .html-Dateien auf SSI-Direktiven zu untersuchen, um sich nicht um die zusätzlichen Dateinamenserweiterung .shtml kümmern zu müssen. Sie müssen aber bedenken, dass der Apache dann jede auszuliefernde Datei lesen muss, selbst wenn sie keine SSI-Direktiven enthält, was die Verarbeitung deutlich verlangsamen kann.

Unter Windows gibt es kein Bit zur Kennzeichnung der Ausführbarkeit einer Datei, was die Optionen einschränkt.

In der Standardkonfiguration sendet der Apache die HTTP-Header für das Datum der letzten Änderung oder den Umfang des Inhalts bei SSI-Seiten nicht, weil diese Werte bei dynamischen Inhalten schwer zu berechnen sind. Das kann eine Zwischenspeicherung des Dokuments verhindern und zu schlechteren Client-Leistungen führen. Dies können Sie auf zwei Arten verhindern:

  1. Verwenden Sie die Option XBitHack Full. Der Apache ermittelt dann das Datum der letzten Änderung, indem er nur auf das Datum der ursprünglich angeforderten Datei schaut und Änderungsdaten eingebundener Dateien ignoriert.
  2. Setzen Sie mit den mod_expires-Direktiven ein explizites Ablaufdatum für die Dateien, damit die Browser und Proxies wissen, dass die Dateien zwischengespeichert werden können.
Die wichtigsten SSI-Direktiven

SSI-Direktiven haben folgende Syntax:

<!--#Element Attribut=Wert Attribut=Wert... -->

Sie werden wie ein HTML-Kommentar formatiert, so dass sie vom Browser ignoriert werden, wenn die SSI-Verarbeitung nicht korrekt aktiviert wurde. Sie sind aber trotzdem in der HTML-Quelle erkennbar. Wurde der Server korrekt für SSI konfiguriert, wird die Direktive durch die von ihr erzeugten Ergebnisse ersetzt.

Es können viele Elemente angegeben werden, von denen hier nur einige in den SSI-Beispielen gezeigt werden.

Das aktuelle Datum <!--#echo var="DATE_LOCAL" -->

Das echo-Element gibt den Wert einer Variablen aus. Es gibt eine Reihe von Standardvariablen, zu denen auch alle Umgebungsvariablen gehören, die CGI-Programmen zur Verfügung stehen. Mit dem set-Element können Sie auch eigene Variablen setzen.

Gefällt Ihnen das Format der Datumsausgabe nicht, können Sie mit dem config-Element ein timefmt-Attribut angeben, um die Formatierung zu ändern.

<!--#config timefmt="%A %B %d, %Y" -->
Heute ist der <!--#echo var="DATE_LOCAL" -->
Datum der letzten Änderung der Datei Dieses Dokument wurde zuletzt geändert: <!--#flastmod file="index.html" -->

Dieses Element wird auch bei Formatangaben mit timefmt benutzt.

Die Ergebnisse eines CGI-Programms einbinden

SSI-Direktiven werden häufig zur Ausgabe der Ergebnisse eines CGI-Programms verwendet, beispielsweise für den allseits beliebten "Besucherzähler":

<!--#include virtual="/cgi-bin/counter.pl" -->
Weitere Beispiele

Es folgen einige spezielle Beispiele für die Verwendung von SSI_direktiven in HTML-Dokumenten.

Wann wurde das Dokument geändert?

Es wurde bereits erwähnt, dass über SSI der Benutzer über das Datum der letzten Änderung einer Datei informiert werden kann, ohne dass genauer erklärt wurde, wie das funktioniert. Wird der folgende Code in eine HTML-Seite gesetzt, dann erhält diese einen Zeitstempel. Selbstverständlich muss die SSI-Einbindung wie oben beschrieben aktiviert sein.

<!--#config timefmt="%A %B %d, %Y" -->
Diese Datei wurde geändert: <!--#flastmod file="ssi.shtml" -->

Ersetzen Sie ssi.shtml durch den Namen der entsprechenden Datei. Soll nur ein einfacher Code in eine Datei eingefügt werden, mag das etwas umständlich sein. Verwenden Sie in diesem Fall stattdessen die Variable LAST_MODIFIED:

<!--#config timefmt="%D" -->
Diese Datei wurde geändert: <!--#echo var="LAST_MODIFIED" -->

Weitere Einzelheiten zum timefmt-Format finden Sie unter der C-Routine strftime, die die gleiche Syntax verwendet.

Was lässt sich noch einrichten?

Neben dem Zeitformat lassen sich noch zwei weitere Dinge einrichten.

Wenn etwas mit der SSI-Direktive schief läuft, erhalten Sie normalerweise die Meldung:

[Bei der Verarbeitung dieser Direktive ist ein Fehler aufgetreten]

Mit dem errmsg-Attribut des config-Elements können Sie diese Nachricht ändern:

<!--#config errmsg="[Kennen Sie sich nicht mit SSI aus?]" -->

Eine Nachricht, die der Endbenutzer nicht zu sehen bekommen sollte, da alle Probleme mit den SSI-Direktiven beseitigt werden sollten, bevor die Site zugänglich gemacht wird.

Außerdem können Sie mit dem sizefmt-Attribut des config-Elements angeben, in welchem Format die Dateigrößen zurückgegeben werden. Sie können bytes für eine vollständige Angabe in Byte oder abbrev für eine verkürzte Angabe in kByte oder MByte angeben.

Befehle ausführen

Mit dem exec-Element können Sie eine Shell (/bin/sh oder unter Win32 die DOS-Shell) benutzen, um einen Befehl auszuführen. Im folgenden Beispiel wird der Inhalt eines Verzeichnisses angezeigt:

<pre>
<!--#exec cmd="ls" -->
</pre>

Das Gleiche unter Windows:

<pre>
<!--#exec cmd="dir" -->
</pre>

Unter Windows mag die Formatierung bei dieser Direktive etwas seltsam erscheinen, weil die Ausgabe von dir die Zeichenfolge <dir> enthält, was die Browser verwirrt.

Bedenken Sie, dass diese Option sehr gefährlich ist, weil jeder in das exec-Tag eingebettete Code ausgeführt wird. In Situationen, in denen die Benutzer den Inhalt einer Webseite bearbeiten können (beispielsweise bei "Gästebüchern"), müssen Sie darauf achten, dass diese Option deaktiviert ist. Mit dem IncludesNOEXEC-Argument der Options-Direktive können Sie SSI-Direktiven zulassen und die Option exec deaktivieren.

Fortgeschrittene SSI-Techniken

Neben der Ausgabe von Inhalt können die SSI-Direktiven auch zum Setzen von Variablen und zur Verwendung dieser Variablen bei Vergleichen und in Bedingungen benutzt werden.

Warnung

Die meisten der hier vorgestellten Optionen stehen seit Apache 1.2 zur Verfügung. Führen Sie keine entsprechende Version des Apache aus, dann sollten Sie schnellsten ein Upgrade durchführen.

Variablen setzen

Mit der set-Direktive können Sie Variablen setzen. Die Syntax lautet:

<!--#set var="Name" value="Rich" -->

Es können aber nicht nur die Werte gesetzt werden, es können auch andere Variablen einschließlich der Umgebungsvariablen oder einiger der oben erwähnten Variablen (z.B. LAST_MODIFIED) eigenen Variablen zugewiesen werden. Durch Voranstellung eines Dollarzeichens ($) vor den Namen wird angegeben, dass es sich um eine Variable und nicht um ein Literal handelt.

<!--#set var="modified" value="$LAST_MODIFIED" -->

Um ein Dollarzeichen in den Wert einer Variablen einzufügen, muss ein Backslash vorangestellt werden.

<!--#set var="cost" value="\$100" -->

Soll eine Variable in die Mitte einer längeren Zeichenkette gestellt werden und besteht dabei die Möglichkeit, dass ihr Name vor anderen Zeichen endet, die zu Missverständnissen führen könnten, kann der Variablenname in geschweifte Klammern gesetzt werden. Gute Beispiele hierfür sind schwer zu finden, aber vielleicht lässt Sie das folgende ahnen, worum es geht:

<!--#set var="date" value="${DATE_LOCAL}_${DATE_GMT}" -->
Bedingungsausdrücke

Durch die Möglichkeit, Variablen setzen, vergleichen und sie zur Formulierung von Bedingungen benutzen zu können, wird SSI zu einer Art Programmiersprache. mod_include erlaubt mit den Anweisungen if, elif, else und endif die Formulierung von bedingten Anweisungen. Auf diese Weise lassen sich aus einer einzelnen Seite mehrere logisch abgeleiteten Seiten erzeugen.

Die Struktur dieses Bedingungskonstrukts sieht folgendermaßen aus:

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

Eine Testbedingung kann ein logischer Vergleich (Vergleich von Werten oder die Überprüfung ob ein Wert "wahr" ist) sein. (Eine Zeichenfolge hat den Wert true, wenn sie nicht leer ist.) Eine vollständige Liste der verfügbaren Vergleichsoperatoren finden Sie in der Dokumentation des Moduls mod_include. Es folgen einige Beispiel für die Verwendung dieses Konstrukts.

In die Konfigurationsdatei kann folgende Zeile eingefügt werden:

BrowserMatchNoCase macintosh Mac
BrowserMatchNoCase MSIE InternetExplorer

Damit werden die Umgebungsvariablen Mac und InternetExplorer auf wahr gesetzt, wenn der Client den Internet Explorer auf einem Macintosh ausführt.

Im SSI-fähigen Dokument kann dann folgendes geschehen:

<!--#if expr="${Mac} && ${InternetExplorer}" -->
Apologetic text goes here
<!--#else -->
Cool JavaScript code goes here
<!--#endif -->

(Dieser Code entstand in einer Situation, als ein JavaScript mit dem Internet Explorer auf einem Mac nicht funktionieren wollte, überall sonst aber funktionierte, und war als Zwischenlösung gedacht.)

Jede Variable (selbst definierte oder normale Umgebungsvariablen) kann in Bedingungsanweisungen benutzt werden. Die Möglichkeit des Apache, Umgebungsvariablen mit den SetEnvIf-Direktiven und verwandten Direktiven zu setzen, eröffnet viele Wege dynamisch Inhalte einzubinden, ohne auf CGI zurückgegriffen werden muss.

Schlussfolgerung

Server-Side Includes sind mit Gewissheit kein Ersatz für CGI oder andere Lösungen zur Erzeugung dynamischer Webseiten, sie eignen sich aber hervorragend zum dynamischen Einfügen kleiner Inhaltselemente in Seiten, ohne dass dafür größerer Aufwand erforderlich ist.