Return-Path: Delivered-To: apmail-httpd-docs-archive@www.apache.org Received: (qmail 82875 invoked from network); 20 Jan 2004 15:23:56 -0000 Received: from daedalus.apache.org (HELO mail.apache.org) (208.185.179.12) by minotaur-2.apache.org with SMTP; 20 Jan 2004 15:23:56 -0000 Received: (qmail 90149 invoked by uid 500); 20 Jan 2004 15:23:50 -0000 Delivered-To: apmail-httpd-docs-archive@httpd.apache.org Received: (qmail 90127 invoked by uid 500); 20 Jan 2004 15:23:50 -0000 Mailing-List: contact docs-help@httpd.apache.org; run by ezmlm Precedence: bulk list-help: list-unsubscribe: list-post: Reply-To: docs@httpd.apache.org Delivered-To: mailing list docs@httpd.apache.org Received: (qmail 90112 invoked from network); 20 Jan 2004 15:23:49 -0000 Message-ID: <400D47B8.4050706@t-online.de> Date: Tue, 20 Jan 2004 16:22:32 +0100 From: JGiesecke@t-online.de (Jobst Giesecke) User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:1.0.2) Gecko/20021120 Netscape/7.01 X-Accept-Language: de-de, de MIME-Version: 1.0 To: docs@httpd.apache.org Subject: German translation CGI.xml Content-Type: multipart/mixed; boundary="------------040704070105090406060006" X-Seen: false X-ID: bHAjeeZJgeB825v7gPGrsNHSFg6MEJCQXV1+OARIoYn+0hhAhEID42 X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N X-Spam-Rating: minotaur-2.apache.org 1.6.2 0/1000/N --------------040704070105090406060006 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit --------------040704070105090406060006 Content-Type: text/html; name="cgi.xml.de" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="cgi.xml.de" Praxis / Anleitungen Apache Tutorial: Dynamische Inhalte mit CGI
Einführung mod_alias mod_cgi AddHandler Options ScriptAlias

CGI (Common Gateway Interface) ist eine Schnittstelle für die Interaktion zwischen Webservern und Inhalte erzeugenden Programmen, die als CGI-Programme oder CGI-Skripte bezeichnet werden. Es handelt sich hier um die einfachste und weit verbreitete Möglichkeit, dynamische Inhalt für eine Website zu generieren. Dieses Kapitel beschreibt die CGI-Einrichtung für den Apache-Webserver und enthält eine Einführung in die CGI-Programmierung.

Den Apache für CGI einrichten

Damit CGI-Programme korrekt ausgeführt werden, muss der Apache für CGI konfiguriert werden. Dies kann auf unterschiedliche Weise geschehen.

ScriptAlias

Die ScriptAlias-Direktive teilt dem Apache mit, dass ein bestimmtes Verzeichnis für CGI-Programme vorgesehen ist. Der Apache geht davon aus, dass jede Datei in diesem Verzeichnis ein CGI-Programm ist und wird versuchen, es auszuführen, wenn eine bestimmte Ressource von einem Client angefordert wird.

Die ScriptAlias-Direktive sieht folgendermaßen aus:

ScriptAlias /cgi-bin/ /usr/local/apache/cgi-bin/

Das Beispiel befindet sich in der Konfigurationsdatei httpd.conf, wenn der Apache standardmäßig installiert wurde. Die ScriptAlias-Direktive ist mit der Alias-Direktive vergleichbar, die den URL-Präfix festlegt, der einem bestimmten Verzeichnis zugeordnet ist. Alias und ScriptAlias werden normalerweise für Verzeichnisse benutzt, die außerhalb des DocumentRoot-Verzeichnisses liegen. Der Unterschied zwischen Alias und ScriptAlias besteht darin, dass ScriptAlias die zusätzliche Bedeutung hat, dass alles, was unterhalb des URL-Präfix liegt, als CGI-Programm betrachtet wird. Das oben aufgeführte Beispiel teilt dem Apache mit, dass jede Anfrage nach einer Ressource, die mit /cgi-bin/ beginnt, über das Verzeichnis /usr/local/apache/cgi-bin/ bedient und als CGI-Programm betrachtet werden soll.

Wird beispielsweise die URL http://www.example.com/cgi-bin/test.pl angefordert, versucht der Apache die Datei /usr/local/apache/cgi-bin/test.pl auszuführen und die Ausgabe zurückzuliefern. Die Datei muss selbstverständlich vorhanden und ausführbar sein und die Ausgabe in einer bestimmten Weise erfolgen, sonst kommt es zu einer Fehlermeldung.

CGI außerhalb von ScriptAlias-Verzeichnissen

CGI-Programme dürfen sich aus Sicherheitsgründen oft nur in den mit ScriptAlias angegebenen Verzeichnissen befinden. Auf diese Weise kann der Administrator genau steuern, wer CGI-Programme benutzen darf. Werden die richtigen Sicherheitsvorkehrungen getroffen, gibt es jedoch keinen Grund, warum CGI-Programme nicht aus beliebigen Verzeichnissen ausgeführt werden sollten. Beispielsweise ist es denkbar, dass Benutzer in ihren Stammverzeichnissen Webinhalte mit der UserDir-Direktive anlegen. Wenn sie eigene CGI-Programme einbinden möchten, aber keinen Zugriff auf das eigentliche cgi-bin-Verzeichnis haben, dann müssen sie in der Lage sein, CGI-Programme anderswo auszuführen.

Mit Options die CGI-Ausführung erlauben

Mit der Options-Direktive in der in der Konfigurationsdatei des Hauptservers kann die Ausführung von CGI-Programmen aus einem bestimmten Verzeichnis zugelassen werden:

<Directory /usr/local/apache/htdocs/somedir>
Options +ExecCGI
</Directory>

Diese Direktive weist den Apache an, die Ausführung von CGI-Dateien zuzulassen. Dem Server muss außerdem mitgeteilt werden, welche Dateien CGI-Dateien sind. Die folgende AddHandler-Direktive weist den Server an, alle Dateien mit den Erweiterungen cgi oder pl als CGI-Programme zu behandeln:

AddHandler cgi-script cgi pl
.htaccess-Dateien

In einer .htaccess-Datei können Konfigurationsdirektiven auf Verzeichnisebene gesetzt werden. Wenn der Apache eine Ressource ausliefert, sucht er in dem Verzeichnis, aus dem die angeforderte Datei stammt, nach der Datei .htaccess und falls sie vorhanden ist, wendet er die darin enthaltenen Direktiven an. Die .htaccess-Dateien werden mit der AllowOverride-Direktive aktiviert, die angibt, welche Direktiventypen diese Dateien enthalten dürfen oder ob sie überhaupt zulässig sind. Um die Direktive zuzulassen wird in diesem Fall die folgende Konfiguration für den Hauptserver benötigt:

AllowOverride Options

Die .htaccess-Datei muss die folgende Direktive enthalten:

Options +ExecCGI

Sie teilt dem Apache mit, dass die Ausführung von CGI-Programmen aus diesem Verzeichnis erlaubt ist.

Ein CGI-Programm schreiben

Es gibt zwei Hauptunterschiede zwischen der "normalen" Programmierung und der CGI-Programmierung.

Zum einen muss den Ausgaben des CGI-Programms ein MIME-Typ-Header vorangestellt werden. Dieser HTTP-Header teilt dem Client mit, welche Art von Inhalt er empfängt. Meist sieht das wie folgt aus:

Content-type: text/html

Zum zweiten muss es sich um eine HTML-Ausgabe oder um ein anderes Format handeln, das der Browser anzeigen kann. In der Regel ist dies das HTML-Format, ein CGI-Programm kann aber auch ein GIF-Bild oder anderen Inhalt liefern, der nicht das HTML-Format hat.

Abgesehen von diesen Eigenarten unterscheidet sich ein CGI-Programm kaum von anderen Programmen.

Ihr erstes CGI-Programm

Das folgende Beispielprogramm gibt eine Zeile im Browser aus. Geben Sie die nachstehenden Zeilen ein und speichern Sie sie in der Datei first.pl in Ihrem cgi-bin-Verzeichnis.

#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello, World.";

Auch wenn Sie Perl nicht kennen, sollten Sie trotzdem verstehen, was hier geschieht. Die erste Zeile teilt dem Apache (oder der aktuellen Shell) mit, dass dieses Programm ausgeführt werden kann, indem es dem Interpreter an der Position /usr/bin/perl übergeben wird. Die zweite Zeile gibt die besprochene Deklaration des Inhaltstyps gefolgt von zwei Zeilenvorschüben aus. Das führt zur Ausgabe einer Leerzeile nach dem Header, die das Ende des HTTP-Headers und den Anfang des Rumpfs signalisiert. Die dritte Zeile gibt schließlich "Hello, World." aus..

Wenn Sie Ihren Browser öffnen und ihm die Adresse

http://www.example.com/cgi-bin/first.pl

oder die von Ihnen für die Datei gewählte Adresse übergeben, wird die Zeile Hello, World. im Browser angezeigt. Das ist nicht sehr aufregend, veranschaulicht aber, wie CGI-Programme ausgeführt werden.

Wenn es nicht funktioniert

Es gibt vier Möglichkeiten, was der Browser anzeigen kann, wenn Sie versuchen, auf das CGI-Programm zuzugreifen:

Die Ausgabe des CGI-Programms
In diesem Fall funktioniert alles prima.
Den Quellcode des CGI-Programms oder eine "POST Method Not Allowed"-Meldung
In diesem Fall ist der Apache nicht korrekt für die Ausführung Ihres CGI-Programms konfiguriert. Lesen Sie noch einmal im Abschnitt Den Apache für CGI einrichten nach und versuchen Sie, den Fehler zu finden.
Eine Meldung, die mit "Forbidden" beginnt
Hier liegt ein Problem mit den Zugriffsberechtigungen vor. Überprüfen Sie das Apache-Fehlerprotokoll und den folgenden Abschnitt über Dateiberechtigungen.
Die Meldung "Internal Server Error"
Wenn Sie das Apache-Fehlerprotokoll überprüfen, finden Sie wahrscheinlich den Hinweis "Premature end of script headers", möglicherweise in Verbindung mit einer vom CGI-Programm erzeugten Fehlermeldung. In diesem Fall müssen Sie anhand der folgenden Abschnitte überprüfen, warum das CGI-Programm nicht die korrekten HTTP-Header sendet.
Dateiberechtigungen

Der Server wird nicht unter den gleichen Voraussetzungen ausgeführt, denen Sie unterliegen. Beim Start läuft der Server mit den Berechtigungen eines nicht privilegierten Benutzers (normalerweise unter dem Benutzer nobody oder www) und benötigt daher zusätzliche Berechtigungen, um Dateien auszuführen, deren Eigentümer Sie sind. Gewöhnlich erhält eine Datei genug Berechtigungen für die Ausführung durch den Benutzer nobody, wenn jedem das Recht zur Ausführung der Datei eingeräumt wird:

chmod a+x first.pl

Liest das Programm aus einer anderen Datei oder schreibt es in eine andere Datei, dann müssen diese Dateien mit den entsprechenden Rechten versehen sein.

Das gilt nicht, wenn der Server für suexec konfiguriert wurde. Dieses Programm erlaubt die Ausführung von CGI-Programmen unter anderen Benutzerrechten, je nach dem, auf welchem virtuellen Host oder in welchem Stammverzeichnis eines Benutzers sie sich befinden. suexec nimmt eine sehr strenge Prüfung der Berechtigungen vor und jede Ablehnung führt dazu, dass ein CGI-Programm mit dem Fehler Internal Server Error abgebrochen wird. In diesem Fall müssen Sie die suexec-Protokolldatei überprüfen, um festzustellen, welche Sicherheitsprüfung die Ursache ist.

Pfadangaben

Wenn Sie ein Programm über die Befehlszeile ausführen, benötigen Sie bestimmte Informationen, die der Shell übergeben werden, ohne dass Sie etwas davon bemerken. So wird zum Beispiel ein Pfad benötigt, über den die Shell die von Ihnen genannte Datei finden kann.

Wird ein Programm vom Webserver als CGI-Programm ausgeführt, wird der Pfad nicht benötigt. Alle Programme die Sie aus dem CGI-Programm heraus aufrufen (z.B. sendmail), müssen aber mit dem vollständigen Pfad angegeben werden, damit die Shell sie bei der Ausführung Ihres CGI-Programms finden kann.

Das ist im Allgemeinen an der Pfadangabe für den Skriptinterpreter (oft perl) in der ersten Zeile des CGI-Programms zu erkennen, die so aussehen kann:

#!/usr/bin/perl

Achten Sie darauf, dass tatsächlich der korrekte Pfad zum Interpreter angegeben wird.

Syntaxfehler

Die häufigste Ursache für das Fehlschlagen eines CGI-Programms sind Fehler im Programm selbst. Das gilt insbesondere dann, wenn es zum Abbruch kommt, obwohl die beiden obengenannten Fehler beseitigt wurden. Versuchen Sie immer Ihr Programm zuerst über die Befehlszeile auszuführen, bevor Sie es mit einem Browser testen. Damit schließen Sie die meisten Fehler aus.

Fehlerprotokolle

Die Fehlerprotokolle unterstützen Sie. Alles, was verkehrt läuft, bewirkt einen Eintrag im Fehlerprotokoll. Sie sollten immer zuerst dort nachschauen. Wenn Sie dort, wo Ihre Website untergebracht ist, keinen Zugriff auf das Fehlerprotokoll haben, dann sollten Sie die Site möglicherweise woanders platzieren. Lernen Sie das Lesen der Fehlerprotokolle und Sie werden alle Probleme schnell erkennen und lösen.

Was läuft im Hintergrund ab

Wenn Sie in der CGI-Programmierung weiter vorangeschritten sind, kann es nützlich sein, mehr darüber zu wissen, was im Hintergrund abläuft, insbesondere darüber, wie Browser und Server miteinander kommunizieren. Ein Programm, dass "Hello, World." ausgibt ist zwar ganz nett, besonders nützlich ist es jedoch nicht.

Umgebungsvariablen

Umgebungsvariablen enthalten allgemeine Werte der Betriebssystemumgebung. Sie enthalten nützliche Angaben wie zum Beispiel Suchpfade (in denen nach Pfaden für eingegebene Befehle gesucht wird), Ihren Benutzernamen, den Terminaltyp usw. Eine vollständige Liste der gebräuchlichen Umgebungsvariablen erhalten Sie mit dem Befehl env.

Während der CGI-Transaktion setzen Server und Browser ebenfalls Umgebungsvariablen, damit sie miteinander kommunizieren können. Sie enthalten Informationen wie den Browsertyp (Netscape, IE, Lynx), den Servertyp (Apache, IIS, WebSite), den Namen des CGI-Programms, das ausgeführt wird usw.

Diese Variablen stehen dem CGI-Programmierer zur Verfügung und machen die Hälfte der Client-/Serverkommunikation aus. Die vollständige Liste der erforderlichen Variablen finden Sie unter der Adresse http://hoohoo.ncsa.uiuc.edu/cgi/env.html.

Das folgende einfache CGI-Programm in Perl zeigt alle Umgebungsvariablen an, die ausgetauscht werden. Zwei vergleichbare Programme finden Sie im Verzeichnis cgi-bin der Apache-Distribution. Einige der Variablen sind erforderlich, andere sind optional, so dass einige Variablen aufgeführt werden, die nicht in der offiziellen Liste vorhanden sind. Darüber hinaus bietet der Apache viele unterschiedliche Möglichkeit zum Hinzufügen eigener Umgebungsvariablen zu den standardmäßig vorhandenen.

#!/usr/bin/perl
print "Content-type: text/html\n\n";
foreach $key (keys %ENV) {
print "$key --> $ENV{$key}<br>";
}
STDIN und STDOUT

Eine andere Form der Kommunikation zwischen Server und Client findet über die Standardeingabe (STDIN) und die Standardausgabe (STDOUT) statt. Im Allgemeinen ist STDIN die Tastatur oder eine dem Programm übergebene Datei und STDOUT die Konsole oder der Bildschirm.

Wenn Sie mit POST ein Webformular an ein CGI-Programm senden, werden die Daten aus diesem Formular in einem speziellen Format zusammengeschnürt und dem CGI-Programm über STDIN übergeben. Das Programm kann dann diese Daten so verarbeiten, als kämen sie von der Tastatur oder aus einer Datei.

Dieses "spezielle Format" ist ganz simpel. Ein Feldname und dessen Wert werden mit einem Gleichheitszeichen (=) und Wertepaare mit einem Kaufmannsund (&) miteinander verknüpft. Unbequeme Zeichen wie Leerzeichen, Kaufmannsund und Gleichheitszeichen werden hexadezimal dargestellt, damit sie nicht stören. Ein Beispiel:

name=Rich%20Bowen&city=Lexington&state=KY&sidekick=Squirrel%20Monkey

Manchmal werden Sie diese Art von Zeichenfolge auch an eine URL angehängt finden. In diesem Fall hat der Server die Zeichenfolge der Umgebungsvariablen QUERY_STRING zugewiesen. Man spricht dann von einer GET-Anfrage. Mit dem METHOD-Attribut des FORM-Tag wird angegeben, ob das HTML-Formular für die Auslieferung der Daten GET oder POST benutzt.

Das Programm übernimmt anschließend das Zerlegen dieser Zeichenfolge in brauchbare Informationen. Für die Verarbeitung dieser Daten sowie für andere Dinge stehen Bibliotheken und Module zur Verfügung.

CGI-Module und Bibliotheken

Wenn Sie CGI-Programme schreiben, sollten Sie die Benutzung einer Codebibliothek oder die Verwendung von Modulen in Erwägung ziehen, die Ihnen den größten Teil der Arbeit abnehmen können. Das Ergebnis sind weniger Fehler und eine schnellere Entwicklung.

Schreiben Sie CGI-Programme in Perl, dann stehen Ihnen unter der Adresse CPAN Module zur Verfügung. Das beliebteste Modul für diesen Zweck ist das Modul CGI.pm. Auch das Modul CGI::Lite ist interessant. Es implementiert eine minimale Menge von Funktionalität, die in den meisten Programmen benötigt wird.

Schreiben Sie Ihre CGI-Programme in C, dann stehen Ihnen gliechfalls viele Möglichkeiten zur Verfügung, unter anderem die CGIC-Bibliothek (http://www.boutell.com/cgic/).

Weitere Informationen

Im Web stehen Ihnen viele Quellen für CGI zur Verfügung. Sie können CGI-Probleme mit anderen Anwendern aus der Usenet Group comp.infosystems.www.authoring.cgi diskutieren. Auch die -servers Mailing List der HTML Writers Guild bietet sehr viele Antworten auf Fragen. Mehr finden Sie unter der Adresse http://www.hwg.org/lists/hwg-servers/.

Die CGI-Spezifikation enthält alle Einzelheiten zu CGI-Programmen. Die Originalversion finden Sie unter NCSA und unter Common Gateway Interface RFC Project finden Sie einen aktualisierten Entwurf.

Wenn Sie eine Frage zu einem CGI-Problem an eine Mailing List oder an eine Newsgroup schicken, sollten Sie darauf achten, dass Sie ausreichend Informationen dazu mitliefern, was geschehen ist, was Sie erwartet hatten und was anders als erwartet war, welchen Server Sie ausführen, welche Programmiersprache für das CGI-Programm gewählt wurde und gegebenenfalls den dazugehörigen Code. Das erleichtert die Fehlersuche ganz wesentlich.

Fragen zu CGI-Problemen sollten nicht an die Apache-Fehlerdatenbank gesendet werden, es sei denn Sie sind sich sicher, dass das Problem im Apache-Quellcode liegt.

--------------040704070105090406060006 Content-Type: text/plain; charset=us-ascii --------------------------------------------------------------------- To unsubscribe, e-mail: docs-unsubscribe@httpd.apache.org For additional commands, e-mail: docs-help@httpd.apache.org --------------040704070105090406060006--