Server-parsed html

[Micha's Home]

  [Tips&Tricks]

[Links]


Einführung

Befehle

Include-Variablen

Variablen Substitution

Flußkontrolle (if..)

Anmerkungen

Server-Konfiguration

lokale Konfig. (.htaccess)

Links

Q: Was ist SSI? Warum haben manche Seiten die Endung .shtml?
A: Wahrscheinlich verwendet jemand das Modul mod_include des Apache - Servers zur Dynamisierung der Seiten, oder einfach um sich die copy&paste Arbeit zu sparen.

 

Einführung

Auch ein Web-Server kann bei der Gestaltung von Web-Seiten helfen, dazu stehen auf vielen Servern die sogenannten Server Side Includes (SSI) bereit. 

SSI besteht aus einem Satz relativ einfacher Befehle, die in eine HTML Seite eingebettet werden und direkt auf dem Server ausgeführt werden. 

Ein Befehl hat die Syntax:

<!--#befehl attribut1=wert1 attribut2=wert2 ... -->

Damit ist es zum Beispiel möglich, das aktuelle Tagesdatum, die Uhrzeit, die Dateigröße oder die URL in eine HTML Seite zu übernehmen. Der Besucher merkt davon nichts, nicht einmal der Quellcode gibt einen Hinweis auf den Einsatz von SSI: Denn mit dem Aufruf im Browser werden die SSI Befehle sofort ausgeführt und dann erst mit dem Seitencode ausgegeben.

Seine wahre Pracht entfaltet SSI aber erst mit dem Einsatz von "Includes". Das bedeutet: Sie werden mit einem einfachen Befehl in die Lage versetzt, den Inhalt einer HTML- oder Textseite in eine andere einzufügen und zwar vollautomatisch. Auf diese Weise lassen sich wiederkehrende Elemente wie Menüleisten, Fußzeilen oder Adressen ganz einfach in eine beliebig große Zahl von Seiten einbetten. Muss später etwas verändert werden, brauchen nur die ausgelagerte Elemente angepasst zu werden, nicht jedoch die Seiten selbst. SSI ist nicht Browserabhängig, da es vom Server verarbeitet wird.

So gehen Sie vor:

Legen Sie eine Datei "menu.html" im Unterverzeichnis "daten" an.

Diese Datei enthält eine Menüleiste, ein HTML-Kopfbereich braucht nicht definiert zu werden. Kopieren Sie den folgenden Code in eine beliebige HTML Seite und setzten Sie in dorthin, wo später das Menü erscheinen soll:

<!--#include virtual="/daten/menu.html"-->

Geben Sie Ihrer Datei eine neue Endung - sie muss auf .shtml lauten. Das ist wichtig, damit der Server weiß, dass sich in dieser Datei SSI-Befehle befinden, die er auszuführen hat. Den Vorgang der Ausführung nennt man "parsen". 

Rufen Sie anschließend die Datei mit dem Browser auf. Die Menüleiste wird an dem für sie vorgesehenen Platz erscheinen. Ein Blick in den Quellcode der Seite verrät nichts Auffälliges, die SSI Befehle sind verschwunden und durch das Menü ersetzt. Alles wirkt so, als sei die Seite bereits so geschrieben worden.

Achtung: Das Verfahren funktioniert nur online (Abruf über einen WEB-Server), schließlich werden die Includes auf dem Server ausgeführt.

Via SSI lassen sich auch CGI-Skripte ausführen und deren Ergebnisse direkt in die Seite übernehmen. Angewendet wird das zum Beispiel bei Umfragen, Gästebüchern oder Countern. 


 

[nach oben]

Die Befehle

Befehle

Include-Variablen

Variablen Substitution

Flußkontrolle (if..)

 

include
<!--#include [file|virtual]="<file_to_include>" -->
 
Dies Kommando fügt den Text eines anderen Dokuments oder einer Datei in das aktuelle Dokument ein. Wenn für das Verzeichnis des aktuellen Dokuments die Option IncludesNOEXEC gesetzt ist, und die Include Anweisung die Ausführung eines Programms bewirken würde, dann bewirkt diese Anweisung nichts. Andernfalls werden CGI-Scripte mit der kompletten URL normal ausgeführt; das Kommando darf query strings enthalten.

Das Attribut gibt an, welches Dokument eingebunden werden soll.

file
Als Wert wird ein relativer Pfadname zu dem aktuellen Dokument erwartet. Der Pfadname darf nicht mit ../ oder / beginnen. Das Attribut virtual sollte vorrangig vor file verwendet werden.
virtual
Als Wert wird eine zu dem aktuellen Dokument relative URL erwartet (%-encoded). Die URL darf kein Schema (http://, ftp://) und keinen Hostnamen enthalten. Wenn sie nicht mit einem Slash (/) beginnt,  wird sie relativ zu dem aktuellen Dokument ausgewertet. Die URL darf query strings enthalten.
 

- Include - Anweisungen werden auch rekursiv ausgewertet.

- Die einzubindenden Dateien können optional einen HTML-Kopfbereich enthalten.
 
Beispiele:
<!--#include virtual="header.html" -->

<!--#include virtual="/cgi-bin/guestbook.pl?entry=12345" -->

 
config
Mit diesem Kommando lassen sich einige 'Feineinstellungen' erzielen.
Gültige Attribute sind:
errmsg
Der Wert gibt die Fehlermeldung an, die an den Client geschickt wird, falls ein Fehler beim Parsen des Dokuments auftritt.
sizefmt
Der Wert gibt an, wie Dateigrößen ausgegeben werden sollen.
Gültige Werte sind
bytes (Größe in Byte)
abbrev (Größe in Kb oder Mb)
timefmt
Format-String für die Ausgaben von Datum und Zeit; wird zusammen mit DATE_LOCAL benötigt  (s.a. strftime(3)).
 
<!--#config timefmt="%d.%m.%Y, %H.%M" -->
  • %a = Wochentag kurz, z.B. fri
  • %A = Wochentag lang, z.B. Friday
  • %b = Monat kurz, z.B. Feb
  • %B = Monat lang, z.B. February
  • %Z = Zeitzone, z.B. MEZ 
  • %d = Tag im Monat 2stellig, z.B. 18
  • %e = Tag im Monat, z.B. 8
  • %m = Monat als Zahl, z.B. 02
  • %M = Minuten nach Stunde, z.B. 06
  • %S = Sekunden, z.B. 20
  • %H = Uhrzeit 24stündig, z.B. 18
  • %I = Uhrzeit 12stündig, z.B. 02
  • %U = Kalenderwoche, z.B. 10
  • %y = Jahr 2stellig, z.B. 00
  • %Y = Jahr 4stellig, z.B. 2000
 
echo
Dies Kommando gibt eine der unten angegebenen Include-Variablen aus.
Attribute:
var
Names der auszugebenden Variable.

Beispiel:
<!--#echo var="DATE_LOCAL" -->

  • DOCUMENT_NAME (Name der HTML-Datei) 
  • LAST_MODIFIED (Letzte Änderung der HTML-Datei) 
  • DOCUMENT_URI (Pfad der HTML-Datei)
  • DATE_GMT (Datum/Uhrzeit, nach Greenwich Mean Time) 
  • DATE_LOCAL (Datum/Uhrzeit des Servers (lokal) 
exec
Das exec Kommando führt das angegebene shell- oder  CGI Script aus. Die IncludesNOEXEC Option deaktiviert das Kommando komplett.
Gültige Attribute sind:
cgi
Als Parameter muß eine URL (%-encoded) URL zu einem CGI-Script angegeben werden. Wenn die URL nicht mit einem Slash (/) beginnt, ist sie relativ zu dem aktuellen Dokument.

Das durch die URL spezifizierte Dokument wird als CGI - Script aufgerufen. Dazu muß das Verzeichnis des Scriptes für CGI-Scripte freigegeben sein (mit den Konfigurationsbefehlen ScriptAlias oder der ExecCGI Option).

Dem CGI-Script werden die üblichen Informationen (PATH_INFO und query string (QUERY_STRING)) des originalen Client-Requests übergeben. Die Übergabe von weiteren CGI-Parametern in der URL (..?var=value&...) ist nicht möglich.

Zusätzlich zu dem Standard CGI-Environment werden dem Script noch die Include-Variablen übergeben.

Wenn das Script einen Location: Header anstatt eines normalen Outputs zurückliefert, dann wird dies in einen HTML-Anker übersetzt.

Das include virtual Element sollte vorrangig vor exec cgi benutzt werden.

cmd
Der Server führt den übergebenen String als /bin/sh - Kommando aus. Die Include-Variablen sind für das Kommando verfügbar.
 
Beispiel:
<!--#exec cmd="set | sed 's/\$/<br>/' " -->
(Gibt die verfügbaren Umgebungsvariablen aus)
fsize
Dies Kommando gibt eine Dateigröße in dem mit sizefmt angegebenen Format aus.
file
Relativer Pfad zu dem aktuellen Dokument.
virtual
Der Wert ist eine URL  (%-encoded). Wenn die URL nicht mit einem Slash (/) beginnt, ist sie ralativ zu dem aktuellen Dokument.
flastmod
Dies Kommando gibt das Änderungsdatum des aktuellen Dokumentes im Format timefmt aus. Die Attribute sind analog zum fsize - Kommando.
Beispiel:    <!--#flastmod file="/seite.html" -->
printenv
Gibt alle Variablen und deren Werte aus, die per SSI verfügbar sind (Der Befehl hat keine Attribute).
Beispiel:   
<!--#printenv -->
Eine 'bessere' Ausgabe (mit Zeilenumbruch) bekommt man z.B. mit:
<!--#exec cmd="set | sed 's/\$/<br>/' " -->
printenv benötigt Apache 1.2 und höher.
 
Anmerkung:
printenv sollte man nur zum Debuggen benutzen und keinesfalls auf produktiven Servern 'stehen' lassen, da die Umgebungsvariablen (zu) viel über den Server verraten.
 
set
Setzt den Wert einer Variablen. Attribute:
var
Name der Variablen, die gesetzt werden soll.
value
Wert der angegebenen Variable.
Beispiel: <!--#set var="category" value="help" -->

Include Variablen

Zusätzlich zu den Standard CGI-Variablen (s.a. printenv) sind folgende Variablen für die Kommandos echo, if und elif und jedes aufgerufene Programm verfügbar.
DATE_GMT
Das aktuelle Datum in Greenwich Mean Time im Format timefmt.
DATE_LOCAL
Das aktuelle Datum in der lokalen Zeitzone (des Servers!) im Format timefmt.
DOCUMENT_NAME
Der Dateiname (mit Verzeichnis) des vom Benutzer angeforderten Dokumentes.
DOCUMENT_URI
Die URL  (%-decoded) des vom Benutzer angeforderten Domumentes. Achtung: bei rekursiven Include-Anweisungen ist die nicht die URL des aktuellen Dokumentes.
LAST_MODIFIED
Das letzte Modifikationsdatum des vom Benutzer angeforderten Dokumentes.

 


Variablen Substitution

Variable substitution is done within quoted strings in most cases where they may reasonably occur as an argument to an SSI directive. This includes the config, exec, flastmod, fsize, include, and set directives, as well as the arguments to conditional operators. You can insert a literal dollar sign into the string using backslash quoting:

<!--#if expr="$a = \$test" -->

If a variable reference needs to be substituted in the middle of a character sequence that might otherwise be considered a valid identifier in its own right, it can be disambiguated by enclosing the reference in braces, à la shell substitution:

<!--#set var="Zed" value="${REMOTE_HOST}_${REQUEST_METHOD}" -->

This will result in the Zed variable being set to "X_Y" if REMOTE_HOST is "X" and REQUEST_METHOD is "Y".

EXAMPLE: the below example will print "in foo" if the DOCUMENT_URI is /foo/file.html, "in bar" if it is /bar/file.html and "in neither" otherwise:

<!--#if expr="\"$DOCUMENT_URI\" = \"/foo/file.html\"" -->
    in foo
    <!--#elif expr="\"$DOCUMENT_URI\" = \"/bar/file.html\"" -->
    in bar
    <!--#else -->
    in neither
    <!--#endif -->

Flow Control Elements

These are available in Apache 1.2 and above. The basic flow control elements are:
<!--#if expr="test_condition" -->
    <!--#elif expr="test_condition" -->
    <!--#else -->
    <!--#endif -->

The if element works like an if statement in a programming language. The test condition is evaluated and if the result is true, then the text until the next elif, else. or endif element is included in the output stream.

The elif or else statements are be used the put text into the output stream if the original test_condition was false. These elements are optional.

The endif element ends the if element and is required.

test_condition is one of the following:

string
true if string is not empty
string1 = string2
string1 != string2
string1 < string2
string1 <= string2
string1 > string2
string1 >= string2
Compare string1 with string 2. If string2 has the form /string/ then it is compared as a regular expression. Regular expressions have the same syntax as those found in the Unix egrep command.
( test_condition )
true if test_condition is true
! test_condition
true if test_condition is false
test_condition1 && test_condition2
true if both test_condition1 and test_condition2 are true
test_condition1 || test_condition2
true if either test_condition1 or test_condition2 is true

"=" and "!=" bind more tightly than "&&" and "||". "!" binds most tightly. Thus, the following are equivalent:

<!--#if expr="$a = test1 && $b = test2" -->
    <!--#if expr="($a = test1) && ($b = test2)" -->

Anything that's not recognized as a variable or an operator is treated as a string. Strings can also be quoted: 'string'. Unquoted strings can't contain whitespace (blanks and tabs) because it is used to separate tokens such as variables. If multiple strings are found in a row, they are concatenated using blanks. So,

string1    string2  results in string1 string2
'string1    string2' results in string1    string2

 [nach oben]

Anmerkungen

  

Ob Ihr Server (->Konfiguration) in der Lage ist SSI auszuführen, erfahren Sie entweder vom Provider, oder Sie probieren es einfach aus. Fügen Sie zum Beispiel die Befehlszeile für das Datum in eine HTML Seite, geben Sie ihr einen Namen, der auf .shtml (oder .sht oder .shtm) endet, nach dem anschließenden Upload, rufen Sie die Datei mit dem Browser auf. Erscheint das Datum, ist alles OK.

Ein Server wird durch viele SSI Aufrufe stärker belastet; ob das zum Tragen kommt, hängt von der Performance des Rechners ab und der Zahl der Seitenaufrufe. Suchmaschinen haben keine Problem mit Dateien, die auf .shtml enden. 


 

globale Konfiguration nur vom Administrator des WEB-Servers möglich.

Server-Konfiguration: Aktivierung von Server-Side Includes

.shtml - Dokumente werden vom Server nur korrekt behandelt, wenn dieser auch richtig konfiguriert ist. Dazu sind (mindestens) 3 Anweisungen in der Serverkonfiguration (httpd.conf bzw. srm.conf) erforderlich.
AddType text/html .shtml    	#[1]
AddHandler server-parsed .shtml #[2]
Die AddType-Anweisung [1] bewirkt, daß .shtml-Seiten als html-Seiten behandelt werden. Wenn diese Option nicht angegeben wird, dann bekommen Sie im Browser eigenartige Download-Fenster zu sehen:

In der <Directory> section des jeweiligen Verzeichnisses müssen für das Verzeichnis SSI freigegeben sein.

Options +Includes		#[3]
Die Ausführung von CGI- und shell Komandos kann unterbunden werden mit der Option
Options IncludesNOEXEC		#[4]
 
[nach oben]

Wenn der Server-Admin es erlaubt (oder nicht bedacht hat), kann man mittels lokaler .htaccess-Dateien Verzeichnisse so konfigurieren, daß es 'doch' klappt :-)

Lokale Konfiguration in .htaccess - Dateien

 

Sie können die Anweisungen [1], [3] und [4] auch in lokalen .htaccess-Dateien angeben, wenn dies in der zentralen Konfiguration mit AllowOverride erlaubt wurde.

.htaccess:

AddType text/html .shtml    	#[1]
Options +Includes		#[3]
				

Für WEB-Admins ohne direkten Server-Zugriff ist dies oft die einzige Möglichkeit. Achten Sie immer darauf, daß die .htaccess-Dateien nicht herunter geladen werden können.

IndexIgnore .htaccess


 [nach oben

Weiterführende Links

 
(engl.) Beschreibung des Include-Moduls (Apache)
(engl.) Beschreibung des CGI-Moduls (Apache)
Die Options - Direktive des Apache-Servers.
komplette Apache-Dokumentation (und vieles mehr)
Weitergehende Erweiterung (die php3-Dateien), mit der sehr viel mächtigere Befehle vom Server ausgeführt werden. php ermöglicht u.a. auch Datenbankanbindungen (mysql).
Es gibt auch Module für 'richtige' Script-Sprachen wie perl, tcl usw. Hiermit wird der jeweilige Interpreter direkt in den Server 'eingebaut'. Im Gegensatz zu cgi-Scripten werden hier keine externen Prozesse vom Server benötigt (=> schneller).
 

Letzte Änderung: 02.10.10