Server Side Includes (SSI)
Inhaltsverzeichnis
- Einleitung
- Was ist SSI?
- Konfiguration des Servers
- Programmierung mit SSI
- Ausführungsgeschwindigkeit und Serverbelastung
- Sicherheitsprobleme
- Troubleshooting
- Weitere Literatur
- Feedback
Einleitung
Für viele Zwecke reichen statische HTML-Seiten aus, aber gelegentlich benötigt man interaktive oder dynamische Elemente. Diese werden entweder vom Server oder vom Client bei Bedarf erzeugt und im HTML-Code dargestellt. Es gibt eine Vielzahl möglicher Techniken, um solche Elemente einzubinden, in diesem Abschnitt liegt das Augenmerk auf einer speziellen Technik: der serverseitigen Erzeugung von dynamischen Inhalten mit SSI.
Ziel dieses Beitrags
- Überblick über die Einsatzmöglichkeiten von SSI geben
- Kriterien für die Auswahl einer geeigneten Methode zur Erzeugung dyamischer Webseiten aufstellen
- Konfiguration des Webservers für den Einsatz von SSI erläutern
- Einstieg in die Programmierung dynamischer Webseiten mit SSI bieten
- Übersicht über die SSI-Anweisungen und ihrer Attribute schaffen
- Beispiele für den Einsatz der SSI-Direktiven zeigen
Angesprochenes Publikum
Dieser Beitrag wendet sich an
- Webdesigner
- Webprogrammierer
- Webmaster
- Serveradministratoren
Vorkenntnisse
Für das Verständnis dieses Beitrags sind folgende Kenntnisse hilfreich:
- HTML-Grundlagen
- Administration eines Webservers (Apache)
Systemvoraussetzungen
Zum Ausprobieren der Beispiele und das Erstellen eigener SSI-Dateien benötigt man:
- lauffähiger Apache Webserver
- Editor zum Erstellen von HTML-Dokumenten
Was ist SSI?
Die SSI sind zwar keine universelle Programmiersprache, bieten aber acht mächtige Anweisungen mit etlichen Attributen zur Erzeugung dynamischer Webseiten. Dazu gehöhren:
- vordefinierte Variable (Umgebungsvariable wie CGI)
- eigene Variable
- reguläre Ausdrücke zur Textmustererkennung
- Entscheidungen und bedingte Ausführung von Code und HTML-Blöcken
- Zugriff auf Eigenschaften von Dateien und Verzeichnissen (Größe und Modifikationsdatum)
- Einfügen von Inhalten aus externen Dateien und nderen Datenquellen in eigene HTML-Dokumente
- Ausführung externer Programme
SSI sind - wie der Name bereits andeutet - eine serverseitige Technik. Dies bedeutet, daß der Server bei der Anfrage nach einer HTML-Seite durch den Client den Inhalt der Seite, bzw. einen Teil davon erstellt. Was dabei genau passieren soll, hängt von den SSI-Direktiven in der HTML-Seite ab. Um die enthaltenen Kommandos ausführen zu können, muß der Server die HTML-Datei nach SSI-Direktiven durchsuchen, der Fachausdruck dafür lautet "parsen". Daher erhöhen HTML-Seiten mit SSI-Anweisungen die Belastung des Webservers.
Einsatzbereiche von SSI
Der Haupteinsatzbereich von SSI ist das Einbinden gemeinsamer oder dynamischer Elemente in mehrere HTML-Dokumente durch den Server, z.B. Kopf- und Fußzeilen, Banner, Navigationsleisten o.ä.. Diese Elemente müssen so nur einmal erstellt und gewartet werden und sind trotzdem auf allen Seiten in der aktuellen Fassung präsent. Dadurch kann der Einsatz von Frames und auch JavaScript vermieden werden, die im Zusammenhang mit Suchmaschinen zu Problemen führen können.
Eine weitere wichtige Anwendung von SSI ist das automatische Einbinden von Angaben zur letzten Aktualisierung oder zur Dateigröße, ohne Zutun des Webdesigners.
Vor- und Nachteile von SSI
- Der Inhalt der HTML-Seite kann abhängig von äußeren Parametern dynamisch generiert werden.
- Der Server kann so konfiguriert werden, daß der Besucher bzw. die Suchmaschine den Einsatz von SSI nicht bemerken können.
- Komplexe Seitenlayouts können in kleinere, voneinander unabhängige und einfachere Teile aufgespalten werden, die sich leichter dynamisch generieren oder auch manuell editieren lassen. Dadurch kann der HTML-Code übersichtlicher werden.
- SSI-Anweisungen werden auch vom MS IIS und anderen Servern verstanden und unterstützt.
- Das Generieren dynamischer Webseiten mit SSI belastet den Server (wie jede serverseitige Technik)
- Einige SSI-Anweisungen (besonders #exec) öffnen Sicherheitslöcher. Daher können diese Anweisungen explizit abgeschaltet werden (IncludesNoExec)
Konfiguration des Servers
SSI zählt zwar eigentlich zur Basisfunktionalität eines Webservers, wegen des modularen Aufbaus des Apache-Webservers muß man jedoch darauf achten, daß die SSI-Komponenten auch zur Verfügung stehen.
Damit der Server die SSI-Direktiven ausführt, müssen folgende Bedingungen gelten:
- Der Server muß das Modul mod_include geladen haben: LoadModule includes_module /usr/lib/apache/mod_include.so und AddModule mod_include.c müssen in der httpd.conf eingetragen sein (die Pfade gelten zumindest für die SuSE 6.4 und SuSE 7.2 Distributionen).
- In dem Verzeichnis muß die Ausführung von SSI-Anweisungen erlaubt sein. Dazu muß in der Konfigurationsdatei des Servers (httpd.conf) die Direktive Options +Includes bzw. Options +IncludesNoExec stehen. Alternativ kann diese Anweisung auch in der .htaccess-Datei stehen, sofern die Direktive AllowOverride Options in der httpd.conf dies zuläßt. Im Unterschied zu der Option +Includes, die alle SSI-Direktiven zuläßt, erlaubt die Option IncludesNoExec alle SSI-Anweisungen außer denen, die externe Programme aufrufen(#exec und tlw. auch #echo).
- Der Server muß die Dateiendung für die SSI-Dateien kennen - üblicherweise ist das .shtml - und den resultierenden Datentyp (text/html). Die dafür erforderliche Direktive lautet AddType text/html .shtml
- Der Server muß erfahren, daß er Dateien mit der Endung .shtml auf SSI-Anweisungen untersuchen soll. Dies erledigt die Direktive AddHandler server-parsed .shtml .
Bei den obigen Direktiven können übrigens auch andere Endungen angegeben werden, z.B. .shtm oder auch .html . Letztere Variante hätte allerdings den Nachteil, daß der Server alle HTML-Seiten auf SSI-Inhalte hin untersuchen müßte. Da dies den Server sehr belasten würde, wird von dieser Einstellung abgeraten. Ein Vorteil dieser Einstellung wäre jedoch, daß die dynamische Erstellung der Seiteninhaltevor Suchmaschinen und Besuchern verborgen würde.
Auf UNIX-Rechnern kann man mit einem Trick sowohl die Endung .html für SSI-haltige Seiten verwenden, als auch den Server schonen: Werden die HTML-Dateien mit SSI-Anteilen durch das "executable-Bit" gekennzeichnet, so kann die Direktive XBitHack on in der httpd.conf den Server anweisen, nur die Dateien, die als ausführbar gekennzeichnet sind, auf SSI-Anweisungen hin zu untersuchen. Das UNIX-Kommand chmod +x index.html setzt das "executable-Bit" für die Datei index.html, auch manche FTP-Clients ermöglichen das Setzen des x-Bits. Unter Windows funktioniert dieser Trick dagegen nicht.
Programmierung mit SSI
Um mit SSI programmieren zu können, muß man den Aufbau der SSI-Direktiven kennen, sie in den HTML-Quelltext integrieren können und einen Überblick über die Möglichkeiten von SSI haben. Die SSI-Direktiven stehen in dem HTML-Quellcode und werden vom Server beim Parsen der Datei entfernt und durch das Ergebnis der Befehlsausführung ersetzt, bevor das Ergebnis an den Client ausgeliefert wird. Der Client bekommt die SSI-Direktiven nicht zu sehen.
Aufbau von SSI-Direktiven
SSI-Direktiven sehen zunächst einmal aus, wie einfache HTML-Kommentare.
<!--#element attribut1="wert1" attribut2="wert2" ... -->
Für die Funktion der SSI-Anweisungen ist es wichtig, daß kein Leerschritt zwischen dem Kommentarbeginn (<!--) und dem Beginn der SSI-Anweisung (#element) steht! Die Attribute müssen in Anführungszeichen eingeschlossen sein. Zwischen dem letzten Attribut und dem Ende des Kommentars sollte ein Leerzeichen stehen.
Die SSI-Direktiven
Der Apache-Webserver kennt acht SSI-Direktiven:
- #config
- Konfiguration des Ausgabeformats für das Datum, Fehlermeldungen und für Dateigrößen.
- #echo
- Ausgabe von Texten und Variableninhalten
- #endif
- Ende einer #if bzw. #if-#else-Anweisung
- #elif
- Ende eines Zweigs einer #if-Anweisung und Beginn eines alternativen, wiederum von einer Bedingung abhängigen Zweigs. In anderen Programmiersprachen meist als else-if-Konstrukt bekannt und dort meist durch switch-case ersetzt.
- #else
- Beginn des alternativen Zweigs einer #if-Anweisung
- #exec
- Ausführen von Programmen auf dem Server. Wegen der damit verbundenen Sicherheitsrisiken wird diese Anweisung meist durch die Option IncludesNoExec deaktiviert.
- #flastmod
- Datum der letzten Änderung an der im Attribut genannten Datei
- #fsize
- Größe der im Attribut genannten Datei
- #if
- Bedingte Ausführung bzw. Ausgabe. Alles zwischen der #if und der #else bzw. #endif-Anweisung wird nur ausgeführt, wenn die im expr-Attribut genannte Bedingung zutrifft.
- #include
- Einbinden von Dateiinhalten aus separaten Quellen. Die Dateien können ihrerseits weitere SSI-Direktiven enthalten.
- #printenv
- Ausgabe aller Umgebungsvariablen
- #set
- Setzen einer Variablen auf einen bestimmten Wert
Ausführungsgeschwindigkeit und Serverbelastung
Eine SSI-Datei muss vom Server besonders behandelt werden: der gesamte Dateiinhalt ist auf SSI-Anweisungen hin zu untersuchen und die Anweisungen müssen ausgeführt werden. Dies kostet Zeit und belastet den Server. Bei der #include-Direktive kommen außerdem noch die Lesezugriffe auf den Datenträger hinzu: für jede eingebundene Datei muß der Server eine neue Datei öffnen. Je nach Auslastung des Systems kann das die Auslieferung des Ergebnisses stark verzögern.
Beispiel: eine einzelne HTML-Datei - eine aus mehreren kleinen Dateien zusammengesetzte SSI-Datei. Vergleichen Sie die Zeit, bis Sie die Inhalte sehen.
Sicherheitsprobleme mit SSI
Wie jede serverseitig ausgeführte Programmiersprache birgt auch SSI einige Sicherheitsrisiken für den Server:
- Da die Ausführung von SSI-Anweisungen den Server zusätzlich belastet, kann eine Denial of Service (DoS) -Attacke erleichtert werden.
- Da SSI Zugriff auf das Dateisystem hat, kann die Ausführung von beliebigen Programmen (#exec-Anweisung) auf dem Server Probleme bereiten.
Troubleshooting
Existiert die Datei /usr/lib/apache/mod_include.so?
Stehen die folgenden Anweisungen in der /etc/httpd/httpd.conf?
- LoadModule includes_module /usr/lib/apache/mod_include.so
- AddModule mod_include.c
- AddType text/html .shtml
- AddHandler server-parsed .shtml
- XBitHack on (optional, nur unter UNIX möglich)
Sind die Optionen für das Verzeichnis richtig gesetzt (Direktive in httpd.conf oder .htaccess)?
- Options +Includes
- Options +IncludesNoExec
Ist die Dateiendung korrekt?
- .shtml s. AddType-Direktive in der httpd.conf
Wenn mit XBitHack gearbeitet wird, ist das x-Recht gesetzt?
Steht ein Leerzeichen zwischen <!-- und #element (Darf nicht sein!)?
Stehen die Werte für die Attribute in doppelten Anführungszeichen?
Steht ein Leerzeichen vor dem Ende der SSI-Anweisung (-->) (Hier sollte eins sein)?
Sagt das Fehlerprotokoll des Servers etwas über die Dateizugriffe aus?
Sollte die Ausführung der SSI-Anweisungen trotz korrekter Konfiguration des Servers nicht erfolgen, so ist eine Überprüfung des Fehlerprotokolls hilfreich: "premature end of script..." deutet auf fehlende Anführungszeichen hin, fehlt dagegen der Eintrag für den fehlerhaften Aufruf vollkommen, so deutet dies auf ein Leerzeichen zwischen <!--#element hin, da die SSI-Anweisung dann nicht als solche, sondern als HTML-Kommentar erkannt wird - und der wird bekanntlich ignoriert.
Weitere Literatur
Dokumentation zum mod_include
Rich Bowen: "Apache Guide: Introduction to Server Side Includes I, II und II", ApacheToday
Arne Pottharst und Team Ideenreich: Dr. Web
Sven Lennartz: "Dynamische Seiten", c't 20/2001
Stefan Münz: "SelfHTML"
Feedback
Diese Seite soll (noch) besser werden. Ich bitte Sie daher um die Beantwortung der folgenden Fragen: