Oft möchten Sie eine Webseite mit nur sehr kleinen oder einfachen dynamischen Inhalten z.B. der aktuellen Zeit, erstellen. Oder Sie möchten auf allen Webseiten die gleiche Kopf- oder Fusszeile anzeigen lassen. Genau dies können Sie sehr einfach mit SSI (Server-Side Includes) oder auch deren Erweiterung XSSI machen.
Was ist das?
SSI sind Kommandos die man in ein HTML Dokument (eine Webseite) einbetten kann um z.B. andere Programme aufzurufen. Typischerweise wird die Ausgabe dieser Programme oder Aufrufe an die Stelle des SSI Kommandes eingefügt und erst danach die modifizierte Webseite dem Surfer geschickt. Damit kann man z.B. das aktuelle Datum in einer Webseite anzeigen lassen oder eine andere Datei die z.B. ein Menü enthält, einfügen lassen.
Kann ich SSI auf dem RhoneWeb benutzen?
Unsere Linux-Server unterstützten SSI und XSSI bei allen "Webservern" - wenn die Webseite also unter "www.dein-name.ch" gespeichert ist. Unsere Windows-Server unterstützten SSI. Bei Homepages werden keine SSI unterstützt.
Um SSI zu nutzen, muss die HTML-Datei unter Linux immer mit der Endung ".shtml" oder ".shtm" aufhören. Die Kommandos werden in einer normalen HTML-Seite nicht ausgeführt!
Vorteile von SSI
- Integration. SSI sind für den Endanwender (Surfer) nicht sichtbar, da die Daten bereits auf dem Webserver eingefügt werden. Auch im Quelltext der Webseite kann nur das Endresultat und nicht der Code gesehen werden.
- Einfach und schnell implementiert. SSI sind im Gegensatz zu CGI einfacher und schneller eingefügt.
- Website Management. In vielen Webseiten erscheinen immer wieder die gleichen Informationen. Dies kann z.B. ein Adresse, ein Menü oder ein"Copyright" sein. Mit SSI müssen diese Daten nur einmal verwaltet werden und können sehr einfach in jede Webseite eingefügt werden.
Sicherheit
Sicherheitslücken sind in einem System nie vollständig auszuschliessen. Leider gibt es im Zusammenhang mit CGI und Formularen Mängel, die potentielle Risiken darstellen.
- Trauen Sie keinen Angaben die vom Browser kommen. Insbesondere muss z.B. die maximale Länge eines Formularfeldes nicht gleich sein wie die maximale Länge der erhaltenen Zeichenkette.Ein Hidden-Wert kann verändert zurück kommen. Der Surfer kann Kommandos (Befehle) statt z.B. seinem Namen in ein Gästebuch schreiben etc.
- Prüfen Sie alle Benutzereingaben vor der weiteren Verwendung auf erlaubte Zeichen.
SSI Umgebungsvariablen
Alle Umgebungsvariabeln die für CGI Programme verfügbar sind, sind auch für SSI benutzbar. Es gibt jedoch 6 Umgebungsvariablen die nur für SSI gelten:
Umgebungsvariable | Beschreibung |
---|---|
DATE_GMT | Datum und Zeit GMT (Greenwich Mean Time). |
DATE_LOCAL | Datum und Zeit Lokal. |
DOCUMENT_NAME | Aktueller Dateiname. |
DOCUMENT_URI | Virtueller Pfad (relative vom Dokumentroot) zur Datei. |
LAST_MODIFIED | Letztes Änderungsdatum und Zeit der Datei. |
QUERY_STRING_UNESCAPED | Anfragestring wobei allen Shell Metazeichen "\" voransteht. |
SSI Kommandos
Im HTML Dokument (der Webseite) stehen die SSI Kommandos als SGML Kommentar. Normalerweise werden alle Webseiten mit der Endung .shtml oder .shtm geparsed. Dabei werden die Kommandos durch eine evt. Ausgabe ersetzt. Sollte die Datei nicht geparsed werden, so bleiben die Kommandos als Kommentare im Quelltext der Webseite betehen. Jedes Kommando hat das folgende Format:
<!--#Kommando Parameter="Argument" -->
Jedes Kommando hat dabei verschiedene allerdings fast immer nur einen einzigen Parameter.
config
Die Ausgabe bzw Abarbeitung lässt sich mit Hilfe des Kommandos config teilweise anpassen. Damit kann man die Fehlermeldung, die Ausgabe der Dateigrösse und des Datums bzw der Zeit konfigurieren:
- errmsg. Dies definiert die Fehlermeldung die an den Benutzer (Surfer) bei einem Fehler im SSI ausgegeben wird. Die Fehlermeldung in der Server Fehlerlogdatei gespeichert.
- sizefmt. Dies definiert das Format beim Anzeigen der Dateigrösse.
- timefmt. Dies definiert das Format beim Anzeigen von Datum und Zeit.
Beispiele
Wird zum Beispiel eine nicht vorhandene Datei mit einem SSI Befehl eingefügt, so zeigt der Webserver normalerweise folgende Meldung:
[an error occurred while processing this directive]
Man kann nun mit dem oben genannten Kommando die Fehlermeldung anpassen:
<!--#config errmsg="Fehler. Bitte kontaktieren Sie mich@sofort.hier" -->
echo
Das Kommando echo zeigt die speziellen SSI aber auch die anderen Umgebungsvariabeln an. Dabei werden die oben definierten Formate verwendet. Der einzige Parameter ist die anzuzeigende Variabel.
Beispiele:
Wenn irgendwo im Dokument folgende Kommandos eingefügt werden:
<!--#echo var="DOCUMENT_NAME" -->
<!--#echo var="DOCUMENT_URI" -->
<!--#echo var="LAST_MODIFIED" -->
Wird folgendes angezeigt: Dateiname, URL und letztes Änderungsdatum der Datei. Dieses Beispiel zeigt die IP Name oder Adresse des Webservers, den Remote Host Namen und das lokale Datum und Zeit an.
<!--#echo var="SERVER_NAME" -->
<!--#echo var="REMOTE_HOST" -->
<!--#echo var="DATE_LOCAL" -->
include
Das Kommando include fügt eine andere Datei ein. Es gibt zwei mögliche Argumente:
- file. Dies fügt eine Datei ein, die im gleichen Verzeichnis oder tiefer ist. Es können nur Dateien aber nicht CGI (Programme) eingefügt werden.
- virtual. Dies fügt eine Datei ein, die über einen virtuellen Pfad angegeben wird ein. Der Pfad kann relativ (vom aktuellen Dokument aus) oder absolut (mit einem / vom Serverroot) aus sein. Benutzen Sie dieses Kommando um CGI-Programme aufzurufen. Es werden alle entsprechenden Sicherheitsüberprüfungen durchgeführt - wie wenn das CGI-Programm direkt von einem Browser aufgerufen würde.
Beispiele
Es wird die Datei menue.txt eingefügt:
<!--#include file="menue.txt" -->
<!--#include virtual="/cgi-local/mein-cgi-programm.pl" -->
exec
Das Kommando exec erlaubt das ausführen vom Programmen. Die Ausgabe der Programme wird dann in das Dokument eingefügt.Aus Sicherheitsgründen ist dieses Kommando bei unseren Servern nicht erlaubt. Benutzen Sie zum Einbinden von CGI-Programmen das Kommando include virtual. Wie beim Aufruf über eine Webseite wird dadurch der Wrapper und alle damit zusammenhängenden Sicherheitsüberprüfungen benutzt.
flastmod
Das Kommando flastmod fügt das Datum und die Zeit der letzten Änderung einer Datei ein. Die Argumente sind identisch zum Kommando include. Die Formatierung der Ausgabe kann mit dem Kommando timefmt erfolgen. Die Umgebungsvariable LAST_MODIFIED zeigt das Datum und die Zeit der letzten Änderung für das aktuelle Dokument an, bei diesem Kommando können Sie die Datei wählen.
Beispiele:
<!--#flastmod file="datei.txt" -->
<!--#flastmod virtual="/pfad_zu/datei.txt" -->
fsize
Das Kommando fsize fügt die Grösse einer Datei ein. Die Formatierung der Ausgabe kann mit dem Kommando sizefmt erfolgen. Gültige Variablen sind bytes, für eine formatierte Ausgabe der Anzahl der Bytes (formatiert als 1,234,567), oder abbrev - für die abgekürzte Version zur Anzeige der Anzahl der Kilobytes oder Megabytes der betreffenden Datei.
Beispiele:
<!--#fsize file="datei.txt" -->
<!--#fsize virtual="/pfad_zu/datei.txt" -->
Anwendungsbeispiele für SSI
SSI haben viele verschiedene Anwendungen. Damit können einfach und schnell Dokumente mit dynamisch erstellten Inhalten erzeugt werden. Diese Inhalte können das aktuelle Datum, die Dateigrösse oder auch die letzte Änderung einer Datei sein.
Beispiel für das Datum der letzten Änderung der aktuellen Datei:
<!--#echo var="LAST_MODIFIED" -->
Je nach aktueller Formatierung (siehe timefmt) erscheint folgendes im Dokument: Friday, 09-May-99 09:34:18 EDT
Man kann die Ausgabe beim Beispiel oben durch voranstellen des folgendes Kommando anpassen:
<!--#config timefmt="time-format" -->
time-format ist dabei ein String (Zeichenkette) mit einzelnen Parametern bei denen ein % voransteht:
<!--#config timefmt="%A, %B %d, %Y" -->
Danach erscheint das Datum so: Friday, May 9, 1999
Weiter unten ist eine Liste aller möglichen Parameter.
Man kann auch das Datum der letzten Änderung eines anderen Dokuments einfügen:
<!--#flastmod virtual="/pfad_zu/datei.html" -->
Damit kann man z.B. einen Index von Dateien mit den jeweiligen Änderungsdateien erstellen:
<html>
<head>
<title>Inhaltsverzeichnis</title>
</head>
<body>
<h1>Inhaltsverzeichnis</h1>
Die folgenden Dokumente sind vorhanden:
<ul>
<li>Dokument 1 (Letzte Änderung : <pre><!--#flastmod virtual="/pfad_zu/1.html" --></pre>)
<li>Dokument 2 (Letzte Änderung : <pre><!--#flastmod virtual="/pfad_zu/2.html" --></pre>)
</ul>
<pre>
<!--#echo var="LAST_MODIFIED" -->
</pre>
</body>
</html>
Eine andere Anwendung dient der Vereinheintlichung der Website. Man kann z.B. eine Kopfdatei und eine Fussdatei erstellen und diese dann in jedem Dokument oben und unten einbinden. Diese Kopf- und Fussdateien sind keine vollständigen Webseiten, sondern enthalten nur einen HTML-Ausschnitt. Die Dateiendung spielt dabei keine grosse Rolle und kann .txt oder .html sein. In diesem Beispiel wurde vorher eine Datei Kopfzeile.txt und eine Datei Fusszeile.txt erstellt und diese werden nun in jeder Webseite eingebungen:
<html>
<head>
<title>Vorlagen</title>
</head>
<body>
<pre>
<!--#include virtual="kopfzeile.txt" -->
</pre>
<h1>Vorlagen</h1>
<pre>
<!--#include virtual="fusszeile.txt" -->
</pre>
</body>
</html>
SSI Fehlerbehebung
Wenn ein SSI nicht funktioniert gibt es fast immer zwei Varianten:
- Im Browser erscheint an der Stelle des SSI gar nicht zusätzliches. Im Quelltext der Seite ist immer noch der SSI Befehl zu sehen. Das SSI wurde also nicht ausgeführt. Ursache ist vermutlich die falsche Dateiendung. Benutzen Sie .shtm oder .shtml
- Im Browser erscheint a der Stelle des SSI eine Fehlermeldung [an error occurred while processing this directive]. Im SSI Befehl hat es einen Fehler. Beachten Sie die folgenden Punkte.
Bitte beachten Sie folgendes
- Vergessen Sie das # Zeichen nicht und lassen Sie kein Leerzeichen zwischen den -- und den # stehen:
Falsch: <!--echo var="REMOTE_USER" -->
Falsch: <!-- #echo var="REMOTE_USER" -->
Richtig: <!--#echo var="REMOTE_USER" -->
- Kein Leerzeichen zwischen dem = Zeichen und dem Dateinamen.
- Benutzen Sie die Anführungszeichen " beim Argument.
- Schreiben Sie alle Kommandos und Parameter in Kleinschrift.
- Die Argumente können Klein- und Grossschrift enthalten. Unsere Linux Server unterscheiden aber dies und daher muss die Schreibweise genau dem Dateinamen entsprechen.
- Damit Dateien eingefügt werden können, müssen die Zugriffsrechte dies erlauben.
Extended Server-Side Includes
XSSI's (eXtended Server-Side Includes) sind seit Version 1.2 Teil des Apache Webservers. Alle oben genannten Funktionen gelten auch für XSSI.
Vorteile von XSSI
XSSI kennen neben den oben genannten Funktionen und Vorteile von SSI noch einige zusätzliche:
- Mit XSSI sind einige Anwendungen möglich, die bisher nur mit JavaScript möglich waren. XSSI hängt aber im Gegensatz zu JavaScript nicht vom Browser ab.
- Im Gegensatz zu CGI's brauchen XSSI wesentlich weniger Server-Resourcen.
XSSI Kommandos
Ein XSSI Kommando hat das folgende Format:
<!--#Kommando Parameter=Argument ... -->
Das Argument ist normalerweise in Anführungszeichen eingeschlossen. Viele Kommandos erlauben nur ein Argument. Vor dem abschliessenden --> muss ein Leerzeichen sein. XSSI kennt alle SSI Kommandos, mit den folgenden Änderungen und Ergänzungen.
include
Das Kommando include kennt zusätzlich einen Parameter exec mit dem CGI-Programme aufgerufen werden können. Dieses Kommando ist aus Sicherheitsgründen nicht erlaubt.
printenv
Dieses Kommando gibt eine Liste aller Umgebungsvariabeln und deren Wert aus.
Beispiel:
<!--#printenv -->
set
Mit diesem Kommando kann der Wert einer Variabeln gesetzt werden.
<!--#set var="eine_variabel" value="der_wert" -->
Beispiel:
In einem dokument datei.shtml ist folgendes enthalten:
<!--#set var="size" value="$QUERY_STRING" -->
<font face="Verdana" size="<!--#echo var="size"
-->"><!--#echo var="QUERY_STRING" -->Text</font>
Dabei ist QUERY_STRING eine CGI Umgebungsvariabel die für XSSI zugänglich ist. Wenn man nun das Dokument datei.shtml mit einem Parameter aufruft, wobei n=1,2,3 etc ist, so wird die Schriftgrösse von Text varieren. Ebenso kann man andere Werte wie z.B. die Schriftart ändern.
http://www.dein-name.ch/datei.shtml?+n
if, elif, else, endif
Mit diesen Flusskontroll-Kommandos kann man den Ablauf je variabelnabhängig machen.
<!--#if expr="test" -->
<!--#elif expr="test" -->
<!--#else -->
<!--#endif -->
Diese Kommandos funktionieren wie in anderen Programmiersprachen. Nach einem if muss am Schluss ein endiffolgen. Die Kommandos elif und else sind optional. Wenn eine test wahr ist, so werden die folgenden XSSI Kommandos ausgeführt bzw der Text, wenn es text/html ist, ausgegeben.Die möglichen tests sind:
Test | Wert wenn wahr | Beschreibung |
---|---|---|
string | true | Wenn string nicht leer |
string1 = string2 string1 != string2 string1 < string2 string1 <= string2 string1 > string2 string1 >= string2 |
string1 mit string2 vergleichen. Wenn string2 das Format /string/ hat so wird es als Regular Expression behandelt. | |
(test) | true | wenn test wahr ist |
!test | true | wenn test falsch ist |
test1 && test2 | true | wenn beide test1 und test2 wahr sind |
test1 || test2 | true | wenn entweder test1 oder test2 wahr sind |
"=" und "!=" haben Vorrang vor "&&" und "||".
"!" hat die höchste Priorität
Variabeln Substitution
In XSSI werden Variabeln einfach mit ihrem Namen oder auch mit einem vorangestellten Dollarzeichen $ geschrieben (wenn nicht klar ist ob es um eine Variable geht). Die Variabel wird innerhalb von doppelten Anführungszeichen in fast allen erlaubten Orten (echo, config, exec, flastmod, fsize, include, set etc) ersetzt.
<!--#if expr="$x = \$test" -->
Beispiel:
Dieses Beispiel zeigt die Variablen Substitution bei Flusskontroll Kommandos. Es wird "in A" gezeigt wenn DOCUMENT_URI gleich /mitglieder/datei.html ist, "in B" wenn dies /allgemein/datei.html ist und sonst "nicht in A oder B".
<!--#if expr="\"$DOCUMENT_URI\" = \"/mitglieder/datei.html\"" -->
in A
<!--#elif expr="\"$DOCUMENT_URI\" = \"/allgemein/datei.html\"" -->
in B
<!--#else -->
nicht in A oder B
<!--#endif -->
Anwendungsbeispiele für XSSI's
XSSI erweitern das Anwendungsgebiet von SSI erheblich. Man kann z.B. je nach Tageszeit oder je nach Browsertyp verschiedene Webseiten liefern.
XSSI Fehlerbehebung
Neben den oben für SSI genannten Punkten ist auf folgendes zu achten:
- Vor dem Endzeichen
-->
ist ein Leerzeichen zwingend. - Das folgende Kommando zeigt alle Umgebungsvariabeln und deren Werte an. Dies hilft bei der Fehlersuche.
<pre>
<!--#printenv -->
</pre>
SSI Kommandos
Kommando | Parameter | Beschreibung |
config | Modifiziert einige Ausgaben von SSI | |
errmsg | Fehlermeldung | |
sizefmt | Format für die Dateigrösse | |
timefmt | Format für Datum | |
echo | var | Fügt den Wert der Umgeb
Articles connexes |