Sehr Umfangreiche Webseite zum Programmieren in C Perl CGI, Skripting, Linux, SystemprogrammierungSchlüsselworte Die CGI-Schnittstelle GGI Kurs Kapitel 5

Die CGI-Schnittstelle          zurück zum Inhaltsverzeichnis

Damit Sie Skripte auf einem Server ausführen können, muss dafür eine bestimmte Umgebung erzeugt werden. CGI erzeugt uns dieses Umgebung. In diese Kapitel geht es darum, welche Umgebung uns CGI zur Verfügung stellt und wie wir damit arbeiten können.

Filehandles

Den Standard-Filehandles STDIN und STDOUT fällt bei CGI-Skripten eine besondere Bedeutung zu.

STDIN

Erhält der Webserver eine Anfrage (HTTP-Request) mit der POST-Methode vom Webbrowser, ein CGI-Skript zu starten, wird der Nachrichten-Body über STDIN an das CGI-Skript weiter geleitet. Über die Standardeingabe können Sie nun Content-Length Bytes einlesen. Diese eingelesenen Daten liegen allerdings noch in codierter Form vor und müssen erst noch dekodiert werden.

STDOUT

Auf STDOUT geben CGI-Skripte Ihre Daten aus. Die Ausgabe beim Apache-Webserver ist dabei ungepuffert.

Einfacher geht es eigentlich kaum. Daten vom Webbrowser, für das CGI-Skript, werden einfach über die Standardeingabe (STDIN) eingelesen und Daten für den Webbrowser (die Darstellung einer Webseite z.B.), werden über die Standardausgabe (STDOUT) geschrieben. Und hier greifen Sie ein. Sie sind mit einem CGI-Skript dazwischen Verantwortlich für den Datenfluss.

Was die Standardfehlerausgabe (STDERR) bei CGI-Skripte macht, ist nicht festgelegt und somit Abhängig von den einzelnen Webservern.

CGI-Umgebungsvariablen

In den sogenannten Umgebungsvariablen befinden sich Informationen zum Webserver und vom Clienten (Browser). Die CGI-Umgebungsvariablen werden aus drei verschiedenen Quellen erzeugt ...

Einige der Umgebungvariablen, werden aus einer Kombination dieser drei Quellen gesetzt.

Hierzu folgt nun ein Überblick zu den Standard-Umgebungsvariablen ...

AUTH_TYPE
Authentifizierungsmethode zur Überprüfung des Benutzers (falls angefordert).

CONTENT_LENGTH
Größe der Daten in Bytes, die an die Standardeingabe (STDIN) des CGI-Skripts übergeben wurden.

CONTENT_TYPE
Die Art des Dokumentes des Nachrichten-Body.

DOCUMENT_ROOT
Verzeichnis aus dem statischen Webseiten gelesen werden.

GATEWAY_INTERFACE
Version der CGI-Spezifikation des Webservers.

PATH_INFO
Zusätzliche Pfadinformationen, welche Beispielsweise vom Webbrowser übergeben wurden.

PATH_TRANSLATED
Die übersetzte Version von PATH_INFO, welche als Systempfad angegeben wird.

QUERY_STRING
Die Information, die mit einem ? an den URL gehängt wird.

REMOTE_ADDR
Die IP-Adresse des Clients, welcher den Request geschickt hat.

REMOTE_HOST
Der DNS-Name des Clients, der den Request geschickt hat.

REMOTE_IDENT
Name des Remote-Benutzers, der vom Server ermittelt wurde. Funktioniert nur wenn Server und Client die RFC 931-Identifikation unterstützen.

REMOTE_USER
Unterstützt Ihre Server Benutzer-Authentifizierung ist dies der Benutzername, mit dem man sich autentifiziert hat.

REQUEST_METHOD
Die Methode der verwendeten HTTP-Anfrage (meist GET oder POST).

SCRIPT_NAME
URL-Pfad des ausgeführten Skripts.

SERVER_NAME
Der Hostname, der DNS-Alias oder die IP-Adresse des Serverrechners.

SERVER_PORT
Port-Nummer an der die HTTP-Anfrage gesendet wurde. Meistens Port 80.

SERVER_PROTOCOL
Name und Versionsnummer des Protokols, mit dem die Anfrage gesendet wurde.

SERVER_SOFTWARE
Name und Versionsnummer des verwendeten Webservers.


Einige weitere Umgebungsvariablen, die allerdings nicht zu den Standard-Umgebungsvariablen gehören, wären ...

HTTP_ACCEPT
Liste der aktzeptierten Medientypen

HTTP_ACCEPT_CHARSET
Liste der aktzeptierten Zeichensätze

HTTP_ACCEPT_LANGUAGE
Lister der aktzeptierten Sprachen

HTTP_COOKIE
Das Cookie, welches vom Server gesetzt wurde

HTTP_FROM
E-Mail-Adresse des Benutzers, welcher den Request gesendet hat

HTTP_REFERER
Die URL auf die der Benutzer zuletzt besucht hat. Ausnahme eine direkt eingetippte URL oder ein Bookmark

HTTP_USER_AGENT
Name und Versionen des Betriebssystems und des Webbrowsers, der den Request gesendet hat.

Abfragen können Sie diese CGI-Umgebungsvariablen mit dem globalen Hash %ENV. Wie Sie einzelnen Variablen abfragen können, haben Sie bereits im Kapitel zuvor (Das HTTP-Protokol) gelesen. Beispielweise die Umgebungsvariable SERVER_SOFTWARE können Sie folgendermaßen abfragen ...

$webserver = $ENV{'SERVER_SOFTWARE'};

Wir wollen nun ein CGI-Skript schreiben, womit alle vorhandenen Umgebungsvariablen auf dem Browser ausgegben werden. Das Skript ist einfacher als Sie denken ...

#!/usr/bin/perl -w

use strict;

print "Content-type: text/html\n\n";

foreach ( keys %ENV ){
  print "<p><b>$_</b> : $ENV{$_}</p>" if $ENV{$_};
 }

Mit diesem Skript, werden alle Umgebungsvariablen die gesetzt sind ausgegeben. Wenn Sie diesen LINK anklicken, können Sie dieses Skript in Aktion sehen (dazu müssen Sie allerdings online sein).

Ausgabe der CGI-Skripte

Wenn Ihr CGI-Skript etwas ausgeben soll, müssen Sie mindestens eine Headerzeile ausgeben. Der Webserver erledigt dann den Rest, wie zum Beispiel die Ausgabe weiterer Header. Von den nun drei folgenden Headern, müssen Sie mindestens einen mit angeben.

Content-type - Dokumente ausgeben

Wollen Sie, dass Ihr CGI-Skript ein bestimmtes Dokument an den Webbrowser zurückgibt, müssen Sie dem Webserver mitteilen, um was für ein Dokument es sich handelt. Meistens werden Sie ein HTML-Dokument an den Webserver zurückschicken wollen. Dies wir mit folgender Zeile erledigt ...

print "Content-type: text/html\n\n";

Diese beide Newline-Zeichen müssen sein (siehe Einführung in CGI). Dabei wird dem Webserver angezeigt, dass es sich um die letzte Header-Zeile handelt. Wenn der Webserver diese Leerzeile erhält, kann er dem Webbrowser seine Daten schicken. Meistens ist dies das anzeigen einer HTML-Webseite. Natürlich lassen sich mit dem Content-type-Header noch unzählig viele andere Dokumente ausgeben.

Status - Statuscode ausgeben

Damit können Sie angeben, welchen Statuscode der Webserver an den Webbrowser als Response schicken soll. Welchen Statuscode Sie dabei alles verwenden können, haben Sie bereits im Kapitel zuvor gesehen (Das HTTP-Protokol). Wollen Sie zum Beispiel den Statuscode 403 (Forbidden) an den Webbrowser senden, so dass der Surfer keinen Zugriff auf diese Seite hat, können Sie Beispielsweise so vor gehen ...

#!/usr/bin/perl -w

print "Status: 403 Forbidden\n\n";

Natürlich dürfen Sie auch hierbei nicht die Leerzeile vergessen. Wenn Sie diesen Link anklicken, wird dieses Skript demonstriert.

Location - Weiterleiten an eine anderes Dokument

Wollen mit Hilfe eines CGI-Skriptes, anstatt der Ausgabe eines Dokumentes, auf ein anderes Dokument weiterleiten, können Sie dazu den Location-Header verwenden. Dies lässt sich beispielsweise prima einsetzen, wenn sich die URL eines Dokumentes geändert hat. Anwenden können Sie den Header so ...

#!/usr/bin/perl -w

print "Location: umleitungs_ziel.html\n";
print "Content-type: text/html\n\n";

print "<html><head><title>Weiterleitung</title><body>";
print "Falls Ihr Browser keine automatische Weiterleitung unterstützt, klicken Sie";
print "<a href=\"umleitungs_ziel.html\">HIER</a></body></head></html>";

An (alte) Browser, die automatische Umleitung nicht unterstützen, wird in diesem Skript auch gedacht. Dafür sorgt, für den Fall der Fälle, die Ausgabe eines HTML-Dokumentes.