SELFHTML: Webserver/CGI / CGI / CGI-Umgebungsvariablen
Author: Redaktion SELFHTML, selfhtml81@selfhtml.org
Description: Welche Aufgabe CGI-Umgebungsvariablen haben und welche CGI-Umgebungsvariablen es gibt.
Keywords: SELFHTML, CGI, Umgebungsvariablen
Date: 2005-11-10T19:31:11+01:00

| # CGI-Umgebungsvariablen
| Allgemeines zu CGI-Umgebungsvariablen Übersicht bekannter CGI-Umgebungsvariablen

## Allgemeines zu CGI-Umgebungsvariablen

Zur so genannten "CGI-Schnittstelle" gehören auch die CGI-Umgebungsvariablen. Ein installierter Webserver stellt solche Variablen auf Betriebssystemebene zur Verfügung. Bei jedem Aufruf eines CGI-Scripts füllt er einige dieser Variablen mit Informationen. Das CGI-Script kann den Inhalt dieser Variablen auslesen und für eigene Zwecke nutzen. Das CGI-Script kann einige dieser Variablen auch selbst mit Inhalt füllen oder einen dort gespeicherten Inhalt ändern. CGI-Umgebungsvariablen existieren unabhängig von den Variablen, die Sie in einem CGI-Script selbst definieren können.

In CGI-Umgebungsvariablen ist während der Ausführung eines CGI-Scripts beispielsweise der Namen des Server-Rechners gespeichert oder Information zum verwendeten Browser des Anwenders, der den Aufruf des CGI-Programms verursacht hat. Wenn zum Aufruf des CGI-Scripts aus einem Formular die GET-Methode verwendet wurde, stehen die Daten, die der Anwender in das Formular eingegeben hat, in einer CGI-Umgebungsvariable (siehe auch den Abschnitt Formulardaten übertragen mit GET oder POST).

Um CGI-Umgebungsvariablen aus einem CGI-Programm heraus zu nutzen, müssen Sie in der verwendeten Programmiersprache die Techniken zum Auslesen von Umgebungsvariablen einsetzen. In Perl können Sie beispielsweise mit einer Anweisung wie `print $ENV{'SERVER_NAME'};` den Hostnamen des Servers ausgeben. Perl stellt nämlich alle verfügbaren Umgebungsvariablen in einem vordefinierten Hash namens `%ENV;` zur Verfügung.

Um herauszufinden, welche Umgebungsvariablen auf Ihrem Webserver verfügbar sind, können Sie das folgende kleine Perl-Script verwenden. Den Quellcode können Sie mit einem Texteditor im eingestellten CGI-Verzeichnis beispielsweise unter dem Namen env.pl abspeichern. Angenommen, Vorausgesetzt, Ihr CGI-Verzeichnis heißt wie üblich cgi-bin und der Webserver ist gestartet, dann können Sie das Script im Browser mit der Adresse http://127.0.0.1/cgi-bin/env.pl oder auch mit der Adresse http://localhost/cgi-bin/env.pl aufrufen.

### Beispiel: Datei env.pl

    #!/usr/bin/perl -w

    use strict;
    use CGI::Carp qw(fatalsToBrowser);

    print "Content-type: text/html\n\n";
    print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
    print "<html><head><title>Umgebungsvariablen</title></head><body>\n";
    print "<h1>Umgebungsvariablen:</h1>\n";
    print "<table border=\"1\">\n";
    print "<tr><th align=\"left\" bgcolor=\"#E0E0E0\">Variablenname</th>",
          "<th align=\"left\" bgcolor=\"#E0E0E0\">Wert</th></tr>\n";
    foreach(keys(%ENV)) {
      print "<tr><td><b>$_</b></td><td><tt>$ENV{$_}</tt></td></tr>\n";
    }
    print "<tr><th align=\"left\" bgcolor=\"#E0E0E0\" colspan=\"2\">insgesamt: ",
          scalar keys(%ENV)," Umgebungsvariablen</th></tr>\n";
    print "</table>\n";
    print "</body></html>\n";

### Erläuterung:

Das Script erzeugt eine HTML-Tabelle mit allen auf dem Server verfügbaren Umgebungsvariablen. Auf die Perl-Anweisungen wird an dieser Stelle noch nicht näher eingegangen. Nur die erste Zeile des Scripts (die so genannte shebang) müssen Sie möglicherweise anpassen. Dort, wo im Beispiel `#!/usr/bin/perl` steht, müssen Sie, falls Sie beim Aufruf eine Fehlermeldung wie Internal Server Error erhalten, den kompletten Pfad zur ausführbaren Datei, also zum Perl-Interpreter, angeben. Wenn Sie den Perl-Interpreter unter MS Windows beispielsweise unter c:\programme\perl installiert haben, lautet Ihre erste Script-Zeile also:
`#!c:/programme/perl/bin/perl`.
Die Dateinamen-Erweiterung .exe können Sie ohne weiteres weglassen.

## Übersicht bekannter CGI-Umgebungsvariablen

Die folgende Tabelle ist nach Variablennamen alphabetisch sortiert.

Variablenname | Erläuterung
--- | ---
`CONTENT_LENGTH` | Enthält die Anzahl der Zeichen, die beim Aufruf des CGI-Scripts über die `POST`-Methode übergeben wurden. Wenn das CGI-Script beispielsweise beim Absenden eines HTML-Formulars aufgerufen wurde und dort als Übertragungsmethode POST angegeben ist, steht in dieser Umgebungsvariablen, wie viele Zeichen das Script von der Standardeingabe lesen muss, um die übermittelten Formulardaten vollständig einzulesen.
`CONTENT_TYPE` | Enthält beim Aufruf über die POST-Methode den MIME-Typ der übergebenen Daten. Wenn das CGI-Script beispielsweise beim Absenden eines HTML-Formulars aufgerufen wurde und dort als Übertragungsmethode `POST` angegeben ist, steht in dieser Umgebungsvariablen der für HTML-Formulare typische MIME-Typ `application/x-www-form-urlencoded` (zu diesem MIME-Typ siehe auch Datenstrom bei Übertragung von Formulardaten).
`DOCUMENT_ROOT` | Enthält den physischen Pfad des Wurzelverzeichnisses für die Ablage von Dateien, die im Webserver aufrufbar sind. Ein CGI-Script kann aus dieser Angabe beispielsweise absolute Pfadnamen zum Öffnen von Dateien errechnen.
`GATEWAY_INTERFACE` | Enthält die Version der CGI-Schnittstelle, die von dem installierten Server unterstützt wird, z.B. CGI/1.1, wenn die gegenwärtig übliche Version 1.1 der Schnittstellendefinition unterstützt wird.
`HTTP_ACCEPT` | Enthält die Liste der MIME-Typen, die der aufrufende Web-Browser akzeptiert. Die Angabe `*/*` bedeutet: der Web-Browser akzeptiert alles.
`HTTP_ACCEPT_CHARSET` | Enthält die Liste der Zeichenkodierungen, die der aufrufende Web-Browser akzeptiert, beispielsweise `iso-8859-1, utf-8, utf-16, *;q=0.1`.
`HTTP_ACCEPT_ENCODING` | Enthält eine Liste der Kodierungsmethoden, die der aufrufende Browser akzeptiert. Manche Browser akzeptieren beispielsweise auch den Kodierungstyp `gzip`, was bedeutet, dass der Browser auch Dateien empfangen kann, die nach dem GNU-Zip-Algorithmus komprimiert an ihn übertragen werden.
`HTTP_ACCEPT_LANGUAGE` | Enthält, welche Landessprache der aufrufende Browser bei seiner Benutzeroberfläche verwendet. Häufige Werte sind z.B. `de` (für deutschsprachige Browser) oder `en` (für englischsprachige Browser). Ein CGI-Script kann aufgrund dieser Angabe beispielsweise entscheiden, ob es eine deutschsprachige oder eine englischsprachige Antwort an den Browser sendet.
`HTTP_CONNECTION` | Enthält Informationen über den Status der HTTP-Verbindung zwischen Server und aufrufendem Browser. Der Wert `Keep-Alive` bedeutet, der Browser wartet auf Antwort.
`HTTP_COOKIE` | Enthält Namen und Wert von Cookies, sofern solche vom aufrufenden Browser gesendet werden. Mit der Perl-Anweisung: `my @cookies = split(/[;,]\s*/,$ENV{'HTTP_COOKIE'});` können Sie alle gesetzten Cookies ermitteln. Jedes Element des Arrays namens `@cookies` enthält dann jeweils einen Cookie, bestehend aus einem Namen und einem Wert, die durch ein Gleichheitszeichen `=` getrennt sind. Der Wert eines Cookies ist im Format des MIME-Typs `application/x-www-form-urlencoded` gespeichert (zu diesem MIME-Typ siehe auch Datenstrom bei Übertragung von Formulardaten).
`HTTP_HOST` | Enthält den Domain-Namen oder die IP-Adresse aus der Adresszeile des aufrufenden Browsers. Für ein CGI-Script kann diese Angabe wichtig sein, falls es mehrere Server bedienen muss.
`HTTP_REFERER` | Enthält den URI der Web-Seite, von der aus das CGI-Script aufgerufen wurde. Der Wert wird jedoch nicht von allen Web-Browsern korrekt übermittelt, ist also nicht in jedem Fall verfügbar. Anmerkung: Wenn Ihnen die englische Sprache geläufig ist, werden Sie feststellen, dass `HTTP_REFERER` eigentlich `HTTP_REFERRER` heißen müsste. Den Autoren der ersten Spezifikation von HTTP ist dieser Fehler unterlaufen, der sich aus historischen Gründen und aufgrund der Abwärtskompatibilität von HTTP bis heute hält.
`HTTP_USER_AGENT` | Enthält Produkt- und Versionsinformationen zum aufrufenden Web-Browser. Ein CGI-Script kann auf diese Weise ermitteln, welchen Browser ein Anwender verwendet.
`PATH_INFO` | Wird einem CGI-Script eine Zeichenkette mit Daten übergeben, dann enthält `PATH_INFO` den Teil der Zeichenkette nach dem Namen des Scripts bis zum ersten ?. Wenn das Script beispielsweise die Adresse http://meine.seite.net/cgi-bin/test.pl hat, aber mit http://meine.seite.net/cgi-bin/test.pl/querys/musicbase.sql?cat=Mozart aufgerufen wird, dann enthält diese Umgebungsvariable den Anteil `/querys/musicbase.sql`. Sie ist dazu gedacht, Dateinamen mit Pfadangabe als Übergabeparameter für Scripts zu ermöglichen.
`PATH_TRANSLATED` | Enthält wie `PATH_INFO` den Anteil des URI nach dem Scriptnamen bis zum ersten ?, jedoch mit dem Unterschied, dass nicht der Anteil selbst aus dem URI zurückgegeben wird, sondern der vom Webserver übersetzte Datenpfad dieses Anteils. Angenommen, das Script hat die Adresse http://meine.seite.net/cgi-bin/test.pl, wurde aber mit http://meine.seite.net/cgi-bin/test.pl/querys/musicbase.sql aufgerufen. Dann könnte der zusätzliche Adressanteil /querys/musicbase.sql aus Sicht des Webservers beispielsweise in einen physischen Pfadnamen wie /usr/web/seite/querys/musicbase.sql aufgelöst werden. Diesen Pfadnamen würde `PATH_TRANSLATED` zurückgeben.
`QUERY_STRING` | Enthält eine Zeichenkette mit Daten, die dem Script im URI nach dem ersten ? übergeben wurden. Angenommen, das Script hat die Adresse http://meine.seite.net/cgi-bin/test.pl, wurde aber mit http://meine.seite.net/cgi-bin/test.pl?User=Stefan aufgerufen. Dann würde `QUERY_STRING` den Wert `User=Stefan` enthalten. Wenn ein Anwender ein HTML-Formular ausgefüllt hat, bei dessen Absenden das CGI-Script mit der `GET`-Methode aufgerufen wurde, dann stehen in dieser Umgebungsvariablen die ausgefüllten Formulardaten. Die Daten sind nach den Regeln des MIME-Typs `application/x-www-form-urlencoded` kodiert.
`REMOTE_ADDR` | Enthält die IP-Adresse des Server-Rechners, über den das CGI-Script aufgerufen wurde. Es muss sich hierbei nicht unbedingt um die IP-Adresse des aufrufenden Client-Rechners handeln - der Wert kann beispielsweise auch von einem Proxy-Server stammen.
`REMOTE_HOST` | Enthält den Hostnamen des Rechners, über den das CGI-Script aufgerufen wurde. Dieser Wert wird jedoch nur gesetzt, wenn der Webserver entsprechend konfiguriert und dazu in der Lage ist, der IP-Adresse den entsprechenden Hostnamen zuzuordnen. Es muss sich hierbei nicht unbedingt um die IP-Adresse des aufrufenden Client-Rechners handeln - der Wert kann beispielsweise auch von einem Proxy-Server stammen.
`REMOTE_IDENT` | Enthält Protokollinformationen, wenn auf dem Server das Protokoll ident für geschützte Zugriffe läuft.
`REMOTE_PORT` | Ermittelt, über welchen Port des Client-Rechners das CGI-Script aufgerufen wurde. Diese Zahl liegt gewöhnlich im Bereich ab 1024 aufwärts und wird vom aufrufenden Web-Browser zufällig ausgewählt.
`REMOTE_USER` | Enthält den Benutzernamen, mit dem sich der aufrufende Benutzer angemeldet hat, um das CGI-Script ausführen zu lassen. Wenn das Script beispielsweise htaccess-geschützt ist, muss sich der aufrufende Benutzer mit Benutzernamen und Passwort anmelden. Der dabei eingegebene Benutzername kann mit dieser Variable ermittelt werden.
`REQUEST_METHOD` | Enthält die HTTP-Anfragemethode, mit der das CGI-Programm aufgerufen wurde. Beispielsweise `GET` oder `POST`. Ein CGI-Script kann diese Variable auslesen und danach entscheiden, wie es Formulardaten einlesen kann: entweder von der Standardeingabe (bei Methode `POST`) oder aus der Umgebungsvariablen `QUERY_STRING` (bei Methode `GET`).
`REQUEST_URI` | Enthält den HTTP-Pfad des Scripts inklusive der im Aufruf übergebenen Daten. Angenommen, das Script hat die Adresse http://meine.seite.net/cgi-bin/test.pl und wurde mit http://meine.seite.net/cgi-bin/test.pl?User=Stefan aufgerufen. Dann liefert `REQUEST_URI` den Wert `/cgi-bin/test.pl?User=Stefan`.
`SCRIPT_FILENAME` | Enthält den physischen Pfad des Scripts auf dem Server-Rechner, also z.B. `/usr/web/data/cgi-bin/test.pl`.
`SCRIPT_NAME` | Enthält den HTTP-Pfad des Scripts. Angenommen, das Script hat die Adresse `http://meine.seite.net/cgi-bin/test.pl`. Dann liefert `SCRIPT_NAME` den Wert `/cgi-bin/test.pl`.
`SERVER_ADDR` | Enthält die IP-Adresse des Server-Rechners.
`SERVER_ADMIN` | Enthält Namen/E-Mail-Adresse des in der Webserver-Konfiguration eingetragenen Server-Administrators.
`SERVER_NAME` | Enthält den Namen des Server-Rechners, auf dem das CGI-Script läuft. Normalerweise ist dies der eingetragene Hostname des Rechners.
`SERVER_PORT` | Enthält die Portnummer, die für den Webserver eingerichtet wurde. Normalerweise ist dies für Webserver die Nummer 80.
`SERVER_PROTOCOL` | Enthält die Version des HTTP-Protokolls, das der installierte Webserver unterstützt, z.B. `HTTP/1.1`, wenn die gegenwärtig übliche Version 1.1 des HTTP-Protokolls unterstützt wird.
`SERVER_SIGNATURE` | Enthält eine erweiterte Selbstauskunft des Servers, z.B. `Apache/1.3.31 Server at localhost Port 80`.
`SERVER_SOFTWARE` | Enthält den Namen und die Versionsnummer der Webserver-Software auf dem Server-Rechner.

| HTML-Formulare und CGI
| CGI-Scripts auf öffentlichem Webserver installieren

© 2007 Impressum