Apache: Server Side Includes einsetzen und programmieren

In gewöhnlichem HTML-Code eingebettet zeigen die eingeschlossenen SSI-Elemente die Ausgaben von Programmen, Systemvariablen oder das Datum der letzten Änderung einer Datei.

Server Side Includes lösen ein häufiges Problem: Man hat eine fertige HTML-Seite und möchte dort noch kleine zusätzliche Funktionen einbauen, die nur mit einem serverseitigen Skript oder Befehl arbeiten. Ein typisches Beispiel ist eine Zeile wie Zuletzt bearbeitet am …. Hier kommt das Datum ebenfalls via SSI auf die Seite. Schließlich eignen sich die Includes hervorragend, um Dokumente in Webseiten einzubinden.

Wenn man beispielsweise eine ständig aktualisierte Info-Meldung auf der Homepage braucht, schreibt man diese einfach in eine Datei, die bei jedem Aufruf hinzugelinkt wird. Das ist einfacher, als die komplette Seite mit einem CGI-Skript zu programmieren. Ein weiterer Einsatzbereich sind individuelle Seiten. Abhängig vom Browsertypen oder von der Internet Adresse des Clients liefern Apache-Server mit den entsprechenden Includes angepaßte Informationen zurück.

Vom Server interpretiert

Server Side Includes werden vom Server interpretiert, bevor eine Seite über das Netz geht. Daraus resultiert ein Vorteil der Seiten: Der Surfer sieht nicht, wo SSI-Anweisungen tätig sind. Denn er erhält als Dokumentquelltext nur die ausgegebenen Daten der Programme und Befehle. Einzig an der Endung shtml erkennen externe Betrachter, ob es sich bei einem Web-Dokument um eine geparste Seite handelt. Das schützt Programmcode und Ideen.

SSI einbinden

Um mit Server Side Includes zu arbeiten, müssen diese auf dem Server aktiv sein. In vielen Distributionen sind die entsprechenden Parameter voreingestellt, so daß Sie direkt einsteigen können. Falls SSI nicht funktioniert, hilft der Kasten SSI einschalten weiter.

Per Definition finden Server Side Includes in Web-Seiten mit der Endung shtml Platz. Dieses Dokument ist identisch zu einem normalen HTML-File — hier wie dort lassen sich ganz normale HTML-Tags einsetzen.

Um ein Include einzubinden, gilt grundsätzlich diese Syntax:

<!--#[Befehl] [Parameter]="[Wert]" -->

Eine Anweisung darf auch mehrere Parameter enthalten. Beim Programmieren der Anweisungen gilt es, peinlich genau die Syntax zu beachten: Zwischen der Kommentarmarke <!–, dem Doppelkreuz und dem Befehl dürfen grundsätzlich keine Leerzeichen stehen. Viele Probleme mit Server Side Includes liegen an Syntaxfehlern in diesen Zeilen.

SSI simpel

Der einfachste Weg Server Side Includes zu nutzen, sind die vorgegebenen SSI-Anweisungen. Immer wieder gerne gezeigt wird das Datum, an dem eine Seite zuletzt bearbeitet wurde. Der Web-Surfer sieht dann sofort, ob es sich für ihn lohnt, einen näheren Blick auf die Homepage zu werfen. Die entsprechende SSI-Anweisung sieht so aus, eingebettet in ein einfaches HTML-Dokument:

<html>

<head><title>SSI-Test</title></head>

<body>

<h3>SSI-Test</h3>

<p>Die Datei <i>test.shtml</i> wurde zuletzt modifiziert am

<!--#flastmod file="test.shtml" -->

</p>

</body>

</html>

 

Für die Anzeige des Dateidatums ist flastmod zuständig. Als Parameter gilt die Dateiangabe — dabei lassen sich auch andere HTML-Dokumente einbinden. Denkbar wäre zum Beispiel eine Übersicht mehrerer Web-Dokumente und ihrer Modifikationsdaten. Dazu schreiben Sie mehrere dieser flastmod-Anweisungen untereinander.

Analog zu flastmod gibt fsize die Größe einer Datei in Kilobyte an:

<!--#fsize file="test.shtml" -->

Konfiguration

flastmod zeigt sich recht geschwätzig mit der Angabe von Wochentag, Datum, Uhrzeit und Zeitzone. Das ist für die meisten Einsatzzwecke übertrieben. Diese Angaben lassen sich einschränken, indem man eine der Konfigurationsanweisungen von SSI einbaut:

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

Hier kommt die Variable timefmt zum Einsatz. In diesem Beispiel nimmt sie folgende Werte an:

  • %d zeigt das Tagesdatum
  • %m der Monat als Dezimalzahl
  • %y die Jahreszahl

Zwischen den Angaben steht jeweils ein Punkt. Heraus kommt ein schönes Datum in der Form 14.04.99. Diese Formatierung gilt für alle in diesem Dokument folgenden Datumsangaben.

Soll eine vierstellige Datumsanzeige erscheinen, setzen Sie statt %y die Formatierungsanweisung %Y. Weiter gibt es unter anderem diese Werte:

  • %a abgekürzter Name des Wochentags
  • %A ausgeschriebener Name des Wochentags
  • %b abgekürzter Name des Monats
  • %B ausgeschriebener Name des Monats
  • %H die Stunde im 24-Stunden-Format
  • %M die Minute als Ziffer

Wenn Sie also alle Datumsangaben eines Dokuments wie 1. April im Jahr 1999 sehen wollen, geben Sie ein

<!--#config timefmt="%d.%B im Jahr %Y" -->

Eine komplette Liste der Formatierungsanweisungen erhalten Sie mit der Anweisung man strftime auf Ihrer Linux-Shell.

Eine weitere Config-Variable ist errmsg. Die bestimmt den Text der Fehlermeldung, falls etwas beim Parsen der Includes schief geht:

<!--#config errmsg="[Fehler beim Parsen des SSI]" -->

Ohne diese Anweisung erscheint eine englischsprachige Standard-Error-Meldung.

In eine solche Fehlermeldung gehört im Idealfall auch gleich eine E-Mail-Adresse, bei der man um Hilfe anrufen kann. Das folgende HTML-Dokument zeigt einen Ansatz:

<html>

<head><title>SSI-Test</title></head>

<body>

<h3>SSI-Fehlertest</h3>

<!--#set var="mailaddr" value="<a href=mailto:go@foo.bar>Webadmin</a>" -->

<!--#config errmsg="[Fehler. Bitte melden Sie sich mit Angabe der URL an $mailaddr.]" -->

<p>Hier folgt eine künstlich erzeugte Fehlermeldung:<br>

<!--#eho var="was" -->

</body> </html>

Die E-Mail-Adresse des Web-Verwalters kommt in eine eigene Variable — die läßt sich dann auch an anderen Stellen des Dokuments unterbringen. In der Konfiguration der Fehlermeldung findet diese Adresse Eingang, indem Sie dort einfach die Variable mit vorangestelltem Paragraphenzeichen einbauen. Bei einem Fehler erscheint nun korrekt ein anklickbarer Link samt Mail-Adresse. Dieses Listing greift auf selbst definierte Variablen zu. Wie Sie diese einrichten, lesen Sie im folgenden Absatz.

Variablen

SSI eröffnet auch den Blick auf sämtliche Umgebungsvariablen des Servers. So zeigt ein Include beispielsweise den verwendeten Browser oder die IP des Clients. Auch das Server-Datum oder die vom Browser bevorzugte Sprache stehen auf der Liste der Variablen.

Damit Sie sich einen ersten Blick über die zur Verfügung stehenden Variablen verschaffen können, setzen Sie die folgende Zeile in eine Testdatei ein:

<!--#printenv -->

Vorsicht: vor den abschließenden Kommentarzeichen muß ein Leerzeichen stehen, damit der Server die Anweisung versteht. Beim Aufruf der Seite sehen Sie dann alle Variablen, die der Apache-Server bekommt und preisgibt. Hier findet sich übrigens auch eine Variable LAST_MODIFIED. Sie enthält das Datum, an dem die aufrufende Datei zum letzten Mal bearbeitet wurde — eine gute Alternative zu flastmod:

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

#echo gibt den Inhalt der Variablen aus, die im Parameter var steht. Findet sich dort kein gültiger Name, erscheint (none).

Natürlich lassen sich per SSI auch eigene Umgebungsvariablen definieren und weiterverwenden:

<!--#set var="info" value="Hallo Erde" --> 

Mit den selbst definierten Variablen lassen sich zum Beispiel kurze Begrüßungstexte oder immer wiederkehrende Zeichenketten einmal definieren und dann universell einlesen. Das lohnt sich bei Sites, auf denen einzelne Elemente immer wieder global geändert werden müssen.

Bedingungen

Interessant werden Systemvariablen und selbst definierte Umgebungsvariablen im Zusammenhang mit der if-Anweisung. Diese kann den Inhalt einer Variable auswerten und abhängig von ihrem Wert eine neue Umgebungsvariable definieren. Hierbei kommen die vier Anweisungen #if, #elif, #else und #endif zum Einsatz. #elif kennen Programmierer als else if, sprich: “wenn die erste Bedingung nicht wahr ist, überprüfe die nun folgende Bedingung, ob sie zutrifft.” #else schließlich fängt alle Fälle ab, in denen die oberen Bedingungen nicht zutreffen. Wichtig ist, die IF-Konstruktionen bei Server Side Includes immer korrekt mit einem #endif abzuschließen, sonst kann es zu schwer nachvollziehbaren Problemen kommen.

Das folgende Beispiel für ein Intranet erkennt anhand der IP des aufrufenden Systems den Namen des Benutzers.

<!--#if expr="$REMOTE_ADDR = 192.168.0.20" -->

<!--#set var="who" value="Martin" -->

<!--#elif expr="$REMOTE_ADDR = 192.168.0.11" -->

<!--#set var="who" value="Richard" -->

<!--#else -->

<!--#set var="who" value="Gast" -->

<!--#endif -->

Hallo <!--#echo var="who" -->

Das Include wertet die Umgebungsvariable REMOTE_ADDR aus, welche die IP des Clients enthält. Da die Nummer immer eindeutig ist, läßt sich der String auch sehr einfach auswerten. Für komplexere Aufgaben verstehen die Includes reguläre Ausdrücke, wie in diesem einfachen Beispiel:

<!--#if expr="$HTTP_USER_AGENT = /.*MSIE.*/" -->

<!--#set var="was" value="Internet Explorer" -->

<!--#endif -->

Hier prüft die Bedingung /.*MSIE.*/ ob irgendwo in der Variable der String MSIE vorkommt. Die Schrägstriche kennzeichnen Anfang und Ende des regulären Ausdrucks, der Punkt steht für ein beliebiges Zeichen, der Stern für die beliebig häufige Wiederholung des vorangehenden Zeichens. Von links nach rechts gelesen, ergibt der Ausdruck: “es darf in der Zeichenkette ein beliebiges Zeichen am Anfang stehen. Dieses darf sich beliebig oft wiederholen, bis MSIE erscheint. Dann darf wieder irgendein Zeichen vorkommen, das sich ebenfalls beliebig oft wiederholen darf, bis der String zu Ende ist.”

Die Bedingungen sind nicht allein auf das Setzen von Variablen beschränkt. Genauso lassen sich zwischen #if und #endif auch Daten einbinden oder Programme ausführen. Das eröffnet gerade in Intranets neue Wege, personalisierte Sites aufzubauen.

Einbautexte

Oft ändern sich einige Bestandteile einer Homepage, während der optische Rahmen gleich bleibt. Hier bietet sich an, die veränderlichen Informationen in eine eigene Datei auszulagern, während der Rest des HTML-Files unberührt bleibt. Auf diesem Weg finden auch einfache Textdateien den Weg in eine Homepage — ideal, wenn unbedarfte Online-Autoren ihre Texte an eine Site liefern sollen.

Für den Include reicht eine einfache Text- oder HTML-Datei aus. Apache läßt auch HTML-Codes zu, die der Browser dann interpretiert. Eine einfache Datei mit dem Namen info.txt könnte so aussehen:

<h2>Letzte Meldung</h2>

<p>Gummibärchen nun auch in lila erhätlich</p>

Diese Datei schließen sie in ein anderes Dokument ein mit:

<!--#include file="info.txt" -->

Eine Include-Datei darf ihrerseits Server Side Includes beinhalten. Allerdings funktionieren die nur dann, wenn die entsprechenden Zugriffsrechte gesetzt sind und wenn auf normal konfigurierten Systemen die Endung auf shtml lautet.

<!–#include file… –> arbeitet nur dann korrekt, wenn die Datei im selben oder unterhalb des Verzeichnisses steckt, von dem aus das Include aufgerufen wurde. In allen anderen Fällen geben Sie mit dem Parameter virtual einen Pfad relativ zum Root-Verzeichnis Ihrer Homepage an:

<!--#include virtual="/info/info.txt" -->

SSI und Programme

Server Side Includes starten auf Wunsch auch Programme oder Shell-Scripts. Die Standardausgabe der Programme ist dann auf den Webserver umgeleitet. Alle Angaben, die sonst auf der Shell zu sehen wären, erscheinen auf der HTML-Seite.

Einfache Anweisungen reichen Sie an die Shell weiter mit

<!--#exec cmd="ls -l" -->

In diesem Fall wird das List-Kommando in dem Verzeichnis ausgeführt, in dem die aufrufende Datei steckt. Analog funktionieren auch andere Shell-Befehle.

Spannender werden Server Side Includes mit einer Verbindung zu Perl-Scripts oder anderen CGI-Programmen. Hier gilt der Befehl

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

SSI-Parameter in der Serverkonfiguration

Auf den meisten Linux-Distributionen ist Apache bereits so vorkonfiguriert, daß er Server Side Includes verarbeitet. Wenn der erste Test mit einem SSI nicht funktioniert, sollten Sie also zuerst die Syntax genau überprüfen. Stimmt alles, werfen Sie einen Blick in die Konfigurationsdatei srm.conf. Hier müssen diese beiden Zeilen eingebaut sein:

AddType text/html .shtml

AddHandler server-parsed .shtml

Ein zweiter Ansatzpunkt, SSI zum Laufen zu bringen ist die Konfigurationsdatei access.conf. Hier müssen in den <directory…>-Abschnitten für alle Verzeichnisse des Servers Rechte gesetzt werden:

Options Includes

Wer keine Programme oder Kommandozeilenbefehle via Include ausführt, sollte man diese generell verbieten:

Options IncludesNOEXEC

Das schließt eine potentielle Sicherheitslücke. Weitergehende Informationen zu Server Side Includes finden Sie in der Apache-Dokumentation unter Modules/mod_include.

Ähnliche Beiträge