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.
Teil 1: Server-Side
Includes
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:
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 Änderungsdati
erstellen:
<HTML>
<HEAD>
<TITLE>Inhaltsverzeichnis</TITLE>
</HEAD>
<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>
<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.
Part
2. 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:
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 endif folgen. 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>
|
| 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 Umgebungs- oder XSSI-Variabel ein |
| exec |
|
Führt
ein externe Programm aus und fügt die Ausgabe ins aktuelle
Dokument ein
Dies ist aus Sicherheitsgründen nicht erlaubt! |
| cmd |
Programm
auf dem Server |
| cgi |
CGI
Programm |
| flastmod |
file |
Fügt
Datum und Zeit der letzten Änderung einer Datei ein |
| fsize |
file |
Fügt
die Grösse einer Datei ein |
| include |
|
Fügt
den Text einer Datei ins aktuelle Dokument ein |
| file |
Pfadname
relativ zum aktuellen Dokument |
| virtual |
Virtueller
Pfad zum Dokument auf dem Webserver |
|
Format
|
Beschreibung
|
Beispiel
|
|
%%
|
% |
|
|
%a
|
Wochentag
Abkürzung |
Sun
(für Sunday) |
|
%A
|
Wochentag |
Sunday
|
|
%b
|
Monatsname
Abkürzung |
Mar
(für Mar) |
|
%B
|
Monatsname |
March |
|
%d
|
Tag
im Monat als Dezimalzahl |
1
(nicht 01) |
|
%D
|
Datum
als mm/dd/yy (oder %m/%d/%y) |
06/23/95 |
|
%e
|
Tag
im Monat als zweistellige Dezimalzahl (1 - 31) |
01 |
|
%H
|
Stunde
als zweistellige Dezimalzahl (00 bis 23) |
13 |
|
%I
|
Stunde
als zweistellige Dezimalzahl (00 bis 12) |
1 |
|
%j
|
Tag
im Jahr als Dezimalzahl (01 bis 366) |
111 |
|
%m
|
Monat
als zweistellige Dezimalzahl (01 bis 12) |
11 |
|
%M
|
Minuten
einer Stunde als Dezimalzahl (00 bis 59) |
08 |
|
%p
|
AM
oder PM Zeichen |
p.m. |
|
%r
|
Die
12-Stunden Uhrzeit mit AM/PM Zeichen, wie "%I:%M:%S AM | PM"
|
10:24:58
AM |
|
%S
|
Sekunden
einer Minute als Dezimalzahl (00 bis 59) |
50 |
|
%T
|
Zeitangabe
im 24-Stunden Zeitformat "%H:%M:%S" |
16:23:43 |
|
%U
|
Die
Woche im Jahr als Dezimalzahl (00 bis 52) mit Sonntag als erster
Wochentag |
49 |
|
%w
|
Tag
einer Woche als Dezimalzahl (0 bis 6) |
05 |
|
%W
|
Woche
im Jahr (00 bis 53) |
50 |
|
%y
|
Jahr
im Jahrhundert (00 to 99) |
99 |
|
%Y
|
Jahr
als vierstellige Dezimalzahl |
1999 |
|
%Z
|
Die
Zeitzone (wenn ermittelbar) |
EST |
Umgebungsvariabeln (Auswahl)
|
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. |
|