# Was sonst noch wichtig ist

Beinahe nichts in Perl dient einem einzigen Zweck.
Larry Wall

# CGI und SSI

Mit SSI können Sie dynamischen Inhalt in HTML-Dateien einbinden. Die Abkürzung SSI steht für »Server Side Include« und bedeutet so viel wie »serverseitig eingebunden«. Genau dies ist auch die Aufgabe. Mit SSI können Sie in HTML-Dokumenten Programme auf dem Server ausführen und Daten entgegennehmen.

Der Unterschied besteht also darin, dass Sie keine Perl-Scripts schreiben müssen, die HTML-Daten ausgeben, sondern ein HTML-Dokument, das ein Perl-Script ausführen und ausgeben kann. Diese Form der Dynamisierung ist besonders dann gut geeignet, wenn Sie den Zählerstand ausgeben möchten oder die Umgebungsvariablen des Servers. Aber auch die Ausgabe des Datums und der Uhrzeit ist möglich.

Leider unterstützt nicht jeder Server SSI bzw. nur teilweise, und Sie sollten daher in der Dokumentation des Servers nachlesen oder Ihren Provider fragen, ob der eingesetzte Server SSI bereitstellt.

Damit ein Server erkennen kann, dass ein HTML-Dokument SSI verwendet, sollten Sie das Dokument mit einer anderen Dateiendung versehen. Dies sind normalerweise .shtml, .shtm oder .sht. Bei einer Endung wie .htm oder .html kann es vorkommen, dass der Server die enthaltenen SSI-Anweisungen vollkommen ignoriert.

# Ausgabe von Variablen

SSI-Anweisungen werden innerhalb eines HTML-Dokuments in Kommentaren notiert. Nach dem einleitenden Tag folgen ein Rautezeichen und die Anweisung, die ausgeführt werden soll. Danach folgen weitere Parameter, die für die Ausführung der Anweisung nötig sind.

Allgemeine Syntax für die Ausgabe:

<!--#ANWEISUNG PARAMETER="WERT" -->

Für die Ausgabe im Browser müssen Sie als Anweisung echo verwenden. Als Parameter notieren Sie var und als Wert den Namen der Variable, die ausgegeben werden soll.

Ein Beispiel:

<!--#echo var="SERVER_SOFTWARE" -->

Das folgende Listing gibt verschiedene Umgebungsvariablen im Browser aus:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>Listing 9.1</title>
  </head>
  <body>
    <h3>Standard Umgebungsvariablen</h3>
    <p>
      <b>Webserver:</b>
      <!--#echo var="SERVER_SOFTWARE" --><br />
      <b>Webserver-Port:</b>
      <!--#echo var="SERVER_PORT" --><br />
      <b>Webbrowser des Benutzers:</b>
      <!--#echo var="HTTP_USER_AGENT" --><br />
      <b>IP-Adresse des Benutzers:</b>
      <!--#echo var="REMOTE_ADDR" -->
    </p>
    <hr />
    <h3>Zus&auml;tzliche Umgebungsvariablen</h3>
    <p>
      <b>Name des Dokumentes:</b>
      <!--#echo var="DOCUMENT_NAME" --><br />
      <b>Datum:</b>
      <!--#echo var="DATE_LOCAL" --><br />
      <b>Letzte &Auml;nderung:</b>
      <!--#echo var="LAST_MODIFIED" -->
    </p>
  </body>
</html>

Listing 9.1: HTML-Dokument, das mit SSI verschiedene Informationen ausgibt

Die Ausgabe im Browser:

Die Variable SERVER_SOFTWARE enthält in der Regel den Namen und zusätzliche Informationen zum eingesetzten Webserver, die Variable SERVER_PORT und die Portnummer, über die der Webserver angesprochen wird. Dies ist für HTTP normalerweise der Port 80. Die Zeichenfolge, mit der sich der Browser bei dem Webserver identifiziert, ist in der Variable HTTP_USER_AGENT hinterlegt, und die IP-Adresse des Benutzers ist in der Variable REMOTE_ADDR hinterlegt.

Zusätzlich stehen aber noch mehr als nur die Standard-Umgebungsvariablen zur Verfügung. Der Name des aufgerufenen Dokuments ist in der Variable DOCUMENT_NAME gespeichert, und die letzte Änderung dieses Dokuments ist in LAST_MODIFIED gespeichert. Auch die lokale Uhrzeit und das Datum auf dem Server sind abrufbar. Diese Information wird in der Variable DATE_LOCAL gespeichert.

Ausgabe des Listing 9.1 in einem Browser Abbildung 9.1: Ausgabe des Listing 9.1 in einem Browser

# Konfigurationen

Mit der Anweisung config können Sie die Ausgaben mittels SSI auch konfigurieren bzw. formatieren. So können Sie auch die Ausgabe des Datums (DATE_LOCAL) im Erscheinungsbild verändern. Der Parameter lautet timefmt (engl. time format, dt. Zeitformat). Als Wert können Sie dann beliebige Platzhalter notieren, die den Tag, die Stunde oder die Kalenderwoche enthalten.

Platzhalter Erklärung
%a Kurzform des Wochentags, z. B. Mon.
%A Langform des Wochentags, z. B. Monday.
%b Kurzform des Monats, z. B. Apr.
%B Langform des Monats, z. B. April.
%d Tag des Monats mit führender 0, z. B. 05, 12 oder 30.
%e Tag des Monats ohne führende 0, z. B. 1, 7 oder 12.
%H Uhrzeit im 24-Stunden-Format, z. B. 20.
%I Uhrzeit im 12-Stunden-Format, z. B. 08.
%j Julianisches Datum, z. B. 231.
%m Monat als Zahl, z. B. 05.
%M Minuten, z. B. 05, 15 oder 59.
%p Bei 12-Stunden-Format, Ausgabe von AM oder PM.
%S Sekunden, z. B. 03, 20 oder 50.
%U Kalenderwoche, z. B. 27.
%w Tag der Woche, z. B. 2, 5 oder 6.
%y Zweistellige Jahreszahl, z. B. 90, 95 oder 02.
%Y Vierstellige Jahreszahl, z. B. 1990, 1995 oder 2002.
%Z Zeitzone, z. B. MEZ.

Tabelle 9.1: Platzhalter für die formatierte Ausgabe von Datum/Uhrzeit

Ein Beispiel:

<!--#config timefmt="%d.%m.%Y" -->

Wenn Sie config verwenden, um die Datumsausgabe zu formatieren, gilt die angegebene Formatierung nur für die Ausgaben, die nach config folgen. Das Listing 9.2 soll dies verdeutlichen.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>Listing 9.2</title>
  </head>
  <body>
    <h1>Zeitformatierung</h1>
    <p>
      <b>Standard:</b>
        <!--#echo var="DATE_LOCAL" --><br>
      <b>Format TT.MM.JJJJ:</b>
        <!--#config timefmt="%d.%m.%Y" -->
        <!--#echo var="DATE_LOCAL" --><br>
      <b>Format TT. MMMM JJ:</b>
        <!--#config timefmt="%d. %B %y" -->
        <!--#echo var="DATE_LOCAL" --><br>
      <b>Format TT.MM.JJ / HH:MM:SS</b>
        <!--#config timefmt="%d.%m.%y / %H:%M:%S" -->
        <!--#echo var="DATE_LOCAL" --><br>
    </p>
  </body>
</html>

Listing 9.2: HTML-Dokument, das mit SSI verschiedene Datumsformate ausgibt

Browserausgabe des Listing 9.2 Abbildung 9.2: Browserausgabe des Listing 9.2

# Programm ausführen

Die Anweisung zum Ausführen von Programmen lautet exec. Als Parameter notieren Sie dann cgi und als Wert das Script, das ausgeführt werden soll.

Ein Beispiel:

<!--#exec cgi="/cgi-bin/script.pl" -->

Das folgende Beispiel demonstriert die Verwendung eines Zählers für Seitenaufrufe mit SSI.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>Listing 9.3</title>
  </head>
  <body>
    <h1>Z&auml;hler f&uuml;r Seitenaufrufe mit SSI</h1>
    <p>
      <b>Anzahl der Aufrufe:</b>
        <!--#exec cgi="/cgi-bin/list9.4.pl" -->
    </p>
  </body>
</html>

Listing 9.3: HTML-Dokument, das das Script für den Zähler aufruft

#!/usr/bin/perl -w
use CGI qw(:standard);

my $zaehler = 0;

# Alten Zählerstand lesen
if(open(FILE,"<counter.txt"))
{
  my @datei = <FILE>;
  close(FILE);
  $zaehler = $datei[0];
}
  
# Zähler inkrementieren
$zaehler++;

# Zählerstand speichern
open(FILE,">counter.txt");
print FILE $zaehler;
close(FILE);

# Zählerstand ausgeben
print header();
print $zaehler;

Listing 9.4: Perl-Script, das den Zählerstand ausliest, schreibt und im Browser ausgibt

Bei Aufruf des HTML-Dokuments aus Listing 9.3 führt dieses mittels SSI das Perl-Script aus Listing 9.4 aus. Das Perl-Script definiert zu Beginn die Variable $zaehler und setzt den Zählerstand auf 0. Wenn die Datei counter.txt geöffnet werden konnte, wird der Inhalt der Datei gelesen und der Variable $zaehler zugewiesen.

$zaehler = $datei[0];

Anschließend wird der Zählerstand um 1 erhöht.

$zaehler++;

Unabhängig davon, ob die Datei counter.txt existiert, wird der neue Zählerstand nun in die Datei counter.txt geschrieben. Zum Schluss wird der Zählerstand im Browser ausgegeben.

Beachten Sie, dass Sie unbedingt die Anweisung

print header();

notieren, da es ansonsten zu einem Serverfehler kommen kann, da auch das Format der Ausgabe dieses Scripts definiert werden muss.

Weitere Informationen finden Sie auf der Webseite http://httpd.apache.org/docs-2.0/howto/ssi.html der Apache Software Foundation.

# CGI-Umgebungsvariablen

Alle Server, die CGI unterstützen, stellen spezielle Variablen zur Verfügung, die hilfreiche Informationen zum Server und der Umgebung enthalten.

Sie können die Informationen entweder mit Perl aus dem %ENV-Hash auslesen oder mit SSI.

print $ENV{'variablenname'};  
  # Auslesen der Information mittels %ENV  
<!--#echo var="variablenname" -->  
  # Auslesen der Information mittels SSI

Die nachfolgende Tabelle enthält alle Standard-Umgebungsvariablen.

Variablenname Erklärung
CONTENT_LENGTH Enthält die Anzahl der übermittelten Zeichen bei Verwendung der POST-Methode.
CONTENT_TYPE Enthält den MIME-Typ der übermittelten Daten.
DOCUMENT_ROOT Enthält den physischen Pfad des Wurzelverzeichnisses für die Webseite.
GATEWAY_INTERFACE Enthält die CGI-Schnittstellen-Version.
HTTP_ACCEPT Enthält die Liste der MIME-Typen, die der Browser des Benutzers akzeptiert.
HTTP_ACCEPT_CHARSET Enthält die Liste der Zeichensätze, die der Browser des Benutzers akzeptiert.
HTTP_ACCEPT_ENCODING Enthält die Liste der Kodierungsmethoden, die der Browser des Benutzers unterstützt.
HTTP_ACCEPT_LANGUAGE Enthält die Liste der Sprachen, die der Browser des Benutzers unterstützt.
HTTP_CONNECTION Enthält Informationen über den Status der HTTP-Verbindung.
HTTP_COOKIE Enthält Namen und Wert von Cookies, die der Browser bereitstellt.
HTTP_HOST Enhält den Domain-Namen oder die IP-Adresse aus der Adressleiste des Browsers.
HTTP_REFERER Enthält die URI, von der auf das Script zugegriffen wurde.
HTTP_USER_AGENT Enthält die Identifikation des Browsers.
PATH_INFO Enthält die Zeichenkette bis zum ? einer URI.
PATH_TRANSLATED Wie PATH_INFO, nur in physischen Pfad umgesetzt.
QUERY_STRING Enthält die Zeichen nach dem ? einer URI.
REMOTE_ADDR Enthält die IP des Benutzers.
REMOTE_HOST Enthält den Hostname des Benutzers.
REMOTE_IDENT Enthält Protokollinformationen.
REMOTE_PORT Enthält den Port des Benutzers, über den er auf das Script zugreift.
REMOTE_USER Enthält den Benutzernamen bei einer HTTP-Authentifizierung.
REQUEST_METHOD Enthält die Aufruf-Methode (POST oder GET).
REQUEST_URI Enthält die Aufruf-URI des Scripts inklusive der Daten.
SCRIPT_NAME Enthält den HTTP-Pfad des Scripts.
SCRIPT_FILE_NAME Enthält den Namen des Scripts.
SERVER_ADDR Enthält die IP-Adresse des Servers.
SERVER_ADMIN Enthält Namen und E‑Mail-Adresse des Server-Administrators.
SERVER_NAME Enthält den Hostnamen des Servers.
SERVER_PORT Enthält die Portnummer, über die der Webserver angesprochen wird.
SERVER_PROTOCOL Enthält die Version des HTTP-Protokolls des Servers.
SERVER_SIGNATURE Enthält die Webserver-Signatur.
SERVER_SOFTWARE Enthält den Namen des Webservers.

Tabelle 9.2: CGI-Umgebungsvariablen

# Zusammenfassung

  • SSI ermöglicht das Einbinden dynamischen Inhalts durch ein HTML-Dokument.
  • SSI-Anweisungen werden innerhalb von Kommentaren notiert.
  • Mit SSI lassen sich Variablen auslesen, Formatierungen der Ausgabe festlegen und Programme ausführen.
  • Jeder Webserver, der CGI unterstützt, stellt entsprechende Variablen zur Verfügung.

# Fragen und Übungen

  1. Wie lautet die SSI-Anweisung zur Ausgabe von Variablen?
  2. Wie lautet die SSI-Anweisung, um eine Datumsausgabe folgendermaßen zu formatieren: 20. October 2002 / 15:51:32?
  3. Schreiben Sie ein HTML-Dokument, das mit SSI alle Informationen zum Browser des Benutzers ausgibt.