Title: Apache Tutorial: Dynamische Inhalte mit CGI
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.
Damit CGI-Programme korrekt ausgeführt werden, muss der Apache für CGI konfiguriert werden. Dies kann auf unterschiedliche Weise geschehen.
Die
Die
Das Beispiel befindet sich in der Konfigurationsdatei
httpd.conf, wenn der Apache standardmäßig installiert wurde.
Die /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-Programme dürfen sich aus Sicherheitsgründen oft nur in den mit
cgi-bin-Verzeichnis haben, dann müssen sie
in der Lage sein, CGI-Programme anderswo auszuführen.
Mit der
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 cgi oder pl als CGI-Programme
zu behandeln:
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
Die .htaccess-Datei muss die folgende Direktive enthalten:
Sie teilt dem Apache mit, dass die Ausführung von CGI-Programmen aus diesem Verzeichnis erlaubt ist.
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:
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.
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.
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
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.
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.
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:
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.
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:
Achten Sie darauf, dass tatsächlich der korrekte Pfad zum Interpreter angegeben wird.
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.
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.
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 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.
print "Content-type: text/html\n\n";
foreach $key (keys %ENV) {
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:
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.
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/).
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.
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
