|
Mit SSI ist es möglich, sehr einfache dynamische Webseiten herzustallen. Dazu braucht man keine eigene Programmiersprache, aber einen Webserver. |
Auf dieser Seite wird die Arbeit mit ServerSideIncludes kurz vorgestellt. |
Entwicklung
|
Ausgewählte Themen zur IT-Entwicklung |
| Live-SSI | SSI-Anweisungen und ihre Wirkung |
| Apache Konfiguration | Einrichtung von SSI am Apache Webserver |
| Start mit SSI | Test einer einfachen SSI Webseite |
| SSI Anweisungen | SSI-Syntax und einige typische Anweisungen |
| #echo | Ausgabe von Text = HTML Quelltext einfügen |
| #exec | Ausführung von Programmen |
| #flastmod | Datum der letzten Datei-Änderung |
| #include | HTML-Snippets einfügen |
| Variable | Verwendung von eigenen Variablen |
| #if - #else - #endif | Bedingte Verzweigung |
| Fehlerseiten | Apache Fehlermeldungen als Beispiel für SSI-Anwendung |
| Links |
Ausgewählte
|
( Apache) Webserver Konfiguration |
|
Eigener ServerEin eigener Webserver ist auf jeden Fall empfehlenswert. In diesem Fall haben sie Zugang zur Konfiguration und können die angeführten Beispiele selbst ausprobieren. |
Web-ProviderAm Server eines Providers kann nur dann SSI verwendet werden, wenn das in der (für Kunden unzugänglichen) Server-Konfiguration erlaubt und vorbereitet wurde.Wenn das zutrifft, müssen sie SSI zur Verwendung in einem Verzeichnis mit einer .htaccess Datei aktivieren. |
Apache Modul includeDieses Modul wird zur Anwendung von SSI benötigt.● Das Modul include muss vorhanden und installiert sein. Typische Modul-Pfade (Linux, Windows)
/usr/lib/apache-prefork/mod_include.so
C:\Programme\...\Apache\modules\mod_include.so Suchen sie in der Apache Konfiguration nach jenem Abschnitt, in welchem die Module installiert werden. Diese Zeile installiert das Modul env
LoadModule include_module /usr/lib/apache-prefork/mod_include.so
(Apache Windows-Variante mit # abgeschaltet)
# LoadModule include_module modules/mod_include.so
|
SuSE-Linux:
Diese Distribution erzeugt bei Server-Neustart mit dem Script
# /etc/init.d/apache2 restart
automatisch die Text-Datei
/etc/apache2/sysconfig.d/loadmodule.conf
Daher ist es sinnlos, diese Datei manuell zu ändern.(Auch andere Distributionen arbeiten ähnlich). ► In diesem Fall ändern sie die Text-Datei /etc/sysconfig/apache2
Dort finden sie gut kommentiert eine Liste aller zu installierenden
Apache-Module. Fügen sie das Wort include ein
APACHE_MODULES="... include"
► Starten sie Apache neu. Nun sollte in der Datei zur Modul-Konfiguration das Modul mod_include eingetragen und bereits geladen sein. |
Erkennen von SSI-Dateien● Ein Webserver überprüft normalerweise keines der angeforderten Dokumente sondern sendet es so rasch wie möglich an den Browser.● Zur Verwendung von SSI ist es jedoch erforderlich, den Text-Inhalt zu analysieren und jede darin enthaltene SSI-Anweisung auszuführen. Deshalb braucht der Webserver Anhaltspunkte, welche Webseiten er nach SSI-Anweisungen durchsuchen soll. Dazu gibt es 2 Standard-Varianten: • Eine eigene Datei-Erweiterung *.shtml für SSI-Webseiten funktioniert auf jedem Betriebssystem. • Das execute-Bit der Datei wird gesetzt. Das funktioniert auf allen modernen Betriebsystemen, nicht jedoch auf Windows; Dort sind die Zugriffsrechte anders und sehr kompliziert geregelt (Versuchen sie C:>\cacls ) |
● In der Konfiguration des Webservers müssen sie daher angeben, welche Methode der SSI-Erkennung verwendet werden soll. ▼ Theoretisch ist es möglich, alle Webseiten nach SSI zu analysieren. Davon wird dringend abgeraten: Die Mehrheit aller verwendeten Webseiten enthält keine SSI-Anweisungen und wird dadurch wesentlich verzögert. |
Apache KonfigurationDie Konfiguration wird durch Anweisungen ergänzt, die nur dann ausgeführt werden, wenn das Modul mod_include geladen ist.AddTypeDamit wird bekanntgegeben, dass es Text-Dateien *.shtml (zu verarbeiten) gibt.AddOutputFilterDamit wird das Server-Modul mod_include zur Verarbeitung von SSI-Dateien *.shtml angewiesen.Diese Anweisungen werden nicht in die zentrale Konfigurations-Datei httpd.conf eingetragen, sondern in eine eigene Text-Datei, z.B.
/etc/apache2/extra/ssi.conf
Sie müssen dafür sorgen, dass diese Konfigurations-Datei beim
Server-Start verwendet wird, z.B. durch Anfügen dieser Anweisung am
Ende der Standard Konfigurations-Datei httpd.conf
C:\Programme\...\Apache\conf\extra\ssi.conf Include extra/ssi.conf
|
Tragen sie in die Konfigurations-Datei ssi.conf ein:
<IfModule mod_include.c>
(Apache Windows-Variante mit # abgeschaltet)# <IfModule mod_include>
AddType text/html .shtml
</IfModule>
AddOutputFilter INCLUDES .shtml Damit ist die Verwendung von SSI konfiguriert, jedoch vorläufig noch nirgends erlaubt. Dazu ist noch Options Includes ↓ erforderlich. • Jede Änderung der Apache-Konfiguration tritt erst nach Neustart des Servers in Kraft. ♦ Details zur Apache-Konfiguration (Linux, Windows) |
Options +IncludesNOEXECDie Verwendung von SSI muss für ein bestimmtes Verzeichnis ausdrücklich erlaubt werden.• Die Includes-Option erlaubt die Anwendung in einem Verzeichnis. Sie steht entweder in einem <Directory>-Block der Konfigurations-Datei ssi.conf (Beispiel rechts) oder in einer .htaccess Datei. Allerdings macht diese Option die unerwünschte Ausführung gefährlicher Programme viel zu leicht. • Daher wird in der Praxis nur die ähnliche Option IncludesNOEXEC verwendet. |
Anwendung auf ein Verzeichnis (und alle seine Unter-Verzeichnisse), ebenfalls in ssi.conf
<Directory "/srv/www/htdocs/ssi">
# <Directory "C:/web">
# Options Includes
Options IncludesNOEXEC
Diese Methode ist am eigenen Webserver zu bevorzugen, weil die Konfiguration nur einmal beim Start des Servers erfolgt. In diesem Fall werden keine .htaccess Dateien verwendet. |
Server-NeustartDie Webserver-Konfiguration wird nur beim Start gelesen. Nach jeder Änderung müssen sie daher einen Neustart durchführen. |
Diese Maßnahme entfällt natürlich für den entfernten Server eines Providers. Dort verwenden sie die Live-Konfiguration mit .htaccess (unten). |
.htaccessWenn die Live-Konfiguration mit .htaccess Dateien zugelassen wurde, dann kann die Includes-Option darin verwendet werden.Die Anweisungen einer .htaccess Datei gelten nur für jenes Verezichnis, in welchem sich die Datei befindet (und für alle seine Unter-Verzeichnisse). Diese Methode ist langsamer, weil die Konfiguration bei jeder Anforderung einer Datei aus dem betreffenden Verzeichnis wiederholt wird. Sie ist sinnvoll, wenn man keinen Zugriff auf die Standard-Konfiguration des Webservers hat, z.B. als Provider-Kunde. |
Beispiel einer Text-Datei
/srv/www/htdocs/ssi/.htaccess
C:\Web\htdocs\ssi\.htaccess Inhalt der Datei: Options +IncludesNOEXEC
|
Start mit SSI |
|
SSI-VerzeichnisErstellen sie ein eigenes Verzeichnis für SSI-Dateien, z.B.
/srv/www/htdocs/ssi
C:\Web\htdocs\ssi ErlaubnisFür dieses Verzeichnis muss die Verwendung von SSI in der Server-Konfiguration erlaubt werden.► Am eigenen Webserver wird das Verzeichnis in einem <Directory>-Block der Konfigurations-Datei ssi.conf angegeben (Kapitel oben) ► Am entfernten Server eines Web-Providers verschiebt man eine .htaccess Datei nach dem oben gezeigten Muster in das Verzeichnis. |
Web-DokumentErstellen sie im SSI-Verzeichnis eine Minimal-Webseite demo.shtml mit diesem Inhalt
<html>
<body> Hier ist demo.shtml<br /> <!--#echo var="DATE_LOCAL" --><br / >
</body></html> |
Test am eigenen ServerWenn sie über einen eigenen Webserver verfügen, dann starten sie einen Browser und geben diese Adresse ein:http://192.168.0.1/ssi/demo.shtml
Ersetzen sie die angegebene IP-Adresse durch Name oder Adresse ihres Servers.Die dynamische Webseite sollte angezeigt werden: |
Test am Webservers des ProvidersKontrollieren sie, ob sich im Verzeichnis ssi sowohl die .htaccess Datei als auch die dynamische Webseite demo.shtml befinden.Kopieren sie das Verzeichnis samt Inhalt auf den Server des Providers. Geben sie diese Browser-Adresse an: http://domain.xyz/ssi/demo.shtml
Die dynamische Webseite sollte angezeigt werden.
|
|
Wenn alles funktioniert, dann enthält die Webseite nach der
Begrüßung das aktuelle Datum in ungefähr dieser Form:
Wochentag, DD-MMM-YYYY hh:mi:ss
Rechtsklicken sie in die Seite und lassen sie den HTML Quelltext anzeigen. Er sieht ähnlich aus wie im SSI-"Programm" vorgegeben. Allerdings ist der Befehlstext zwischen den Marken <!--# ... --> durch das aktuelle Datum ersetzt. Bei jeder neuen Anforderung wird das aktuelle Datum & Zeit als Text direkt in den Quelltext der Webseite geschrieben. Das "Programm" ist für Web-BesucherInnen niemals sichtbar, nur jener HTML-Text, der vom Programm erzeugt wurde. Das trifft nicht nur für SSI zu sondern für alle dynamischen Webseiten, die durch Programme (Perl, PHP, Python, ...) erzeugt wurden. |
Verwenden sie zum Test einen modernen Browser, z.B. Firefox oder Opera.
Damit sehen sie sofort die häufigsten Fehler: Wenn das angeforderte Dokument (zumindest am angegebenen Pfad) nicht existiert, dann erhalten sie eine Fehler-Webseite. Wenn das Dokument existiert, der Server aber nicht korrekt konfiguriert ist, dann wird der HTML Quelltext angezeigt, weil das Dokument im → HTTP-Header mit der → MIME-Type text/html angekündigt wurde. Der M$IE Browser ignoriert die angegebene Type und stöbert ungefragt im Inhalt von empfangenen Dateien. Wenn darin HTML-Elemente entdeckt werden, dann zeigt dieser Browser in jedem Fall eine Webseite. Wenn der Server nicht korrekt konfiguriert wurde, sieht man zwar eine Mini-Webseite, jedoch ohne Angabe des Datums. Im HTML Quelltext findet man das SSI-Programm genauso wie eingegeben, d.h. die Anweisung wurde nicht ausgeführt. |
SSI Anweisungen |
|||||||||||||||||||
|
●
Alle SSI Anweisungen folgen der gleichen Syntax:
<!--#anweisung -->
Ersetzen sie das Platzhalter-Wort anweisung durch
eine zulässige SSI-Anweisung.• Jede SSI-Anweisung ist in einen HTML-Kommentar dieser Form eingebettet: <!-- -->
•
Ein Browser ignoriert alle Zeichen zwischen diesen Kommentar-Marken.• Ein Webserver erkennt die SSI-Befehle und ersetzt den kompletten HTML Kommentar-Text durch den Ergebnis-Text der Anweisung. Daher finden sie im HTML-Quelltext normalerweise keine SSI-Befehle ! |
Auch andere Programme (Web-Editoren) verwenden HTML-Kommentare zur Einbettung
eigener Anweisungen. Dreamweaver verwendet z.B. diese sehr ähnliche Syntax:
<!-- InstanceBeginEditable name="test" --> <!-- InstanceEndEditable --> Derartige Anweisungen unterscheiden sich von SSI-Befehlen durch das fehlende # Zeichen und werden daher vom Server ignoriert. Daher bleiben WebEditor-Befehle im HTML-Quelltext und können in jeder Webseite (auch dieser) gelesen werden. |
||||||||||||||||||
|
Beispiel:
Diese Anweisung im Original-Text einer Datei test.shtml
<!--#echo var="DATE_LOCAL" -->
wird vom Webserver (bei korrekter SSI-Konfiguration) als SSI-Anweisung erkannt.
|
Der Webserver ersetzt die gesamte "Programm-Zeile" durch diesen Text: Weekday, dd-mon-yyyy hh:mi:ss
Danach wird der Text an ihren Browser gesendet. Der HTML-Kommentar ist
verschwunden und durch den Ergebnis-Text des Programms ersetzt.
|
||||||||||||||||||
Einige ausgewählte SSI-Anweisungen:
|
|||||||||||||||||||
SSI-Anweisung #echo |
|
|
Die SSI-Anweisung #echo wird zur Ausgabe einer
Variablen verwendet: Der Wert einer Variablen wird an Stelle der Anweisung
in den HTML Quelltext der Webseite eingefügt. Dazu werden praktisch nur die Datum & Zeit-Variablen sowie Umgebungs-Variable verwendet. |
Datum & ZeitDie Variable DATE_LOCAL bezeichnet die lokale Zeit (Zeitzone), DATE_GMT bezeichnet die aktuelle → Weltzeit UTC (GMT). Eine vorausgehende #config timefmt Anweisung steuert die Formatierung (Details bei der POSIX-Funktion strftime). |
Umgebungs-VariableEine Liste der Namen von Umgebungs-Daten erhalten sie z.B. mit → Perl oder → PHP. SSI Dokumente und alle anderen CGI-Programme erhalten vom Webserver die gleichen Daten. |
Diese Daten kann man mit #echo ausgeben (in die Webseite eintragen), oder an eigene Variable zuweisen. Diese Variablen werden in der Folge meist zum Steuern einer bedingten Verzweigung verwendet. |
SSI-Anweisung #exec |
|
| Die SSI-Anweisung #exec führt ein Programm am Webserver aus. An Stelle der SSI-Anweisung wird die Ausgabe des Programms eingefügt, d.h. der gesamte vom ausgeführten Programm erzeugte Text. | Diese SSI-Anweisung kann wahlweise für Programme des Typs cgi oder cmd ausgeführt werden. |
CGI ProgrammeSolche Programme befinden sich normalerweise in einem eigenen Verzeichnis, für welches in der Apache-Konfiguration das Alias /cgi-bin/ definiert ist. Nur in diesem Fall erlaubt die Option IncludesNOEXEC ihre Ausführung. |
Beispiel:
<!--#exec cgi="/cgi-bin/env.pl"-->
Fügt an Stelle der SSI-Anweisung die Ausgabe des
CGI-Programms env.pl (ein
Perl Script-Programm) ein.
|
Damit werden →
Konsolen-Programme ausgeführt, z.B. Linux
→
Shell-Programme bzw. Windows
cmd.exe Programme.
Die Erlaubnis, solche Programme auf einem Server auszuführen grenzt
allerdings an Selbstvernichtung. |
• Die Option Includes stammt aus einer Zeit, als man von den technischen Möglichkeiten begeistert war. • Heute wird angesichts der Sicherheits-Probleme ausschließlich die Option IncludesNOEXEC verwendet. |
Bedingte Verzweigung |
|
|
Rechts die allgemeine Syntax einer bedingten Verzweigung. Wenn die bedingung1 erfüllt ist, dann wird block1 ausgegeben (in die Webseite eingetragen). Wenn die bedingung2 erfüllt ist, dann wird block2 verwendet. Wenn keine der beiden Bedingungen erfüllt ist, dann wird blocke verwendet. Die Anweisung #elif erlaubt Mehrfach-Verzweigungen. Innerhalb der Verzweigungs-Blöcke können sowohl HTML-Texte als auch SSI-Anweisungen vorkommen. |
<!--#if expr="bedingung1"-->
block1<br /> <!--#elif expr="bedingung2"--> block2<br /> <!--#else--> blocke<br /> <!--#endif--> |
|
Beispiel:
Zunächst wird der Wert der Umgebungs-Variablen
HTTP_USER_AGENT an die selbst definierte Variable
brs zugewiesen. Bei Verwendung einer Variablen wird ihrem Namen
ein $-Zeichen vorangestellt.Danach wird die Variable brs mit dem → Regulären Ausdruck /MSIE/ geprüft. Anweisung #if verzweigt je nach Ergebnis des Tests. Die folgenden Anweisungen werden entweder aus dem #if-Block oder aus dem #else-Block entnommen. Hier wird einer von 2 Texten ausgewählt und zuletzt mit #echo angezeigt. In der Praxis werden bedingte Verzweigungen meist mit #include-Anweisungen kombiniert: In diesem Fall werde je nach Test-Ergebnis unterschiedliche HTML-Snippets eingefügt. |
<!--#set var="brs" value="brs = ${HTTP_USER_AGENT}"-->
<!--#if expr="$brs = /MSIE/"--> <!--#set var="msg" value="MSIE Browser"--> <!--#else--> <!--#set var="msg" value="Kein MSIE Browser"--> <!--#endif--> <!--#echo var="msg"--> |
|
Rechts eine Variante des gleichen Beispiels: Hier wird auf die Variable msg verzichtet. An ihrer Stelle wird direkt HTML-Text in die beiden Blöcke der Verzweigung eingesetzt. Je nach Test-Ergebnis wird nur einer der beiden Texte in die Webseite übertragen und nachher vom Browser angezeigt. |
<!--#set var="brs" value="brs = ${HTTP_USER_AGENT}"-->
<!--#if expr="$brs = /MSIE/"--> MSIE Browser<br /> <!--#else--> Kein MSIE Browser<br /> <!--#endif--> |
|
|
|
Apache (Version 2)
SSI TU Harburg: SSI-Kurs |
Wikipedia:
Server Side Includes
SelfHTML:
Server Side Includes
|
|