CGI (Common Gateway Interface) Scripts sind Programme, in beliebigen Sprachen geschrieben, die im Wesentlichen nichts anderes tun, als aus irgendeiner Datenquelle heraus eine Webseite zu erstellen und diese Webseite auf die Standard-Ausgabe zu kopieren. Der Trick daran ist jetzt der, dass der Server dieses Script ausführt und das Ergebnis eben nicht auf die Standard-Ausgabe schreibt, sondern an den nachfragenden Client weiterleitet.

Die wesentliche Voraussetzung ist dabei die, dass der Server weiß, aus welchen Verzeichnissen er heraus CGI-Scripts ausführen soll und aus welchen nicht. Grundsätzlich ist es so, dass normale Verzeichnisse nicht geeignet sind um CGI-Scripts auszuführen. Liegt in einem normalen Verzeichnis innerhalb des Document-Baumes eine ausführbare Datei und jemand gibt die URL dieser Datei an, dann wird diese Datei einfach an den Browser weitergeleitet, also ein Download veranstaltet. Das ist natürlich nicht der Effekt, den wir haben wollen. Wir wollen ja, dass der Server das Programm ausführt und uns das Ergebnis übermittelt.

Um das zu erreichen, muß dem Server explizit mitgeteilt werden, welche Verzeichnisse Programme enthalten, die er ausführen soll. Das geschieht mit der Direktive

  ScriptAlias /cgi-bin/  Pfad zum Verzeichnis

Nur durch diese Direktive erfährt der Server, welche Verzeichnisse tatsächlich als Scriptverzeichnisse genutzt werden dürfen. Es dürfen mehrere solcher Angaben gemacht werden (siehe auch Grundkonfiguration).

Diese Direktive gilt nur innerhalb der Konfiguration des Hauptservers und der virtuellen Server. Es muß also vom Verwalter des Webservers explizit freigegeben werden. Individuelle Einstellungen durch eine .htaccess-Datei sind nicht möglich.

Aufbau eines CGI-Scripts

Grundsätzlich gibt ein CGI-Script das an den Client zurück, was es auf die Standard-Ausgabe schreiben würde. Da der Browser aber hier keinen Dateinamen bekommt, anhand dem er entscheiden könnte, was für eine Dateiart es ist (HTML, gif, jpg, …) muß die Ausgabe des Scripts noch einen Mime-Typ voranstellen, bevor die eigentliche Ausgabe beginnt. Der Mime-Typ wird mit einer Leerzeile vom Rest der Ausgabe getrennt.

Ein simples Beispiel, das nur ein Hallo Welt ausgibt könnte – als BASH-Shellscript folgendermaßen aussehen:

  #!/bin/bash
  # Ausgabe des Mime-Types mit Leerzeile
  echo Content-type: text/html
  echo
  # Jetzt die HTML-Seite
  echo "<TITLE>Ein erstes CGI-Script</TITLE>"
  echo "<BODY bgcolor=white>"
  echo "<H1>Hallo Welt</H1>"
  echo "</BODY>"

Das wesentliche Prinzip wird dadurch klar. Ein Script gibt Daten auf die Standard-Ausgabe aus (hier mit echo). Die Ausgabe besteht aus HTML. (Sie muß nicht zwangsläufig HTML sein, es könnte z.B. auch ein Gif-Bild sein, begonnen mit einem Content-type: image/gif) Diese Ausgabe wird an den Browser weitergeleitet, der sie angefordert hatte und der kann sie dann entsprechend darstellen.

Natürlich ist dieses Beispiel völlig nutzlos, denn das hätten wir auch mit einer statischen Webseite hinbekommen. Aber wenn es z.B. darum geht, dass der Server seine Systemzeit anzeigt, dann hätten wir schon eine dynamische Seite:

#!/bin/bash

echo Content-type: text/html
echo
echo "<TITLE>Die Systemzeit</TITLE>"

echo "<BODY bgcolor=white>"
echo "<H1>Die Systemzeit</H1>"
echo "<P><HR><P>"

date "+Es ist der %d.%m.%Y - Es ist jetzt %H:%M Uhr und %S Sekunden"

echo "</BODY>"

Es ist also möglich, dass das Script beliebige Berechnungen oder Programmaufrufe durchführt, deren Ausgabe dann wiederum in die Webseite eingebaut werden. Der Browser bekommt dann eine Webseite mit dem Ergebnis zurück.

Parameterübergabe

Damit ein Browser einem solchen Programm auch Parameter mitgeben kann, etwa die Eingaben eines Userformulars, können zwei Techniken benutzt werden, die schon in der Formularseite angegeben wurden. GET und POST. Die GET-Methode übergibt die Parameter in eine Umgebungsvariable des Servers, die den Namen QUERY_STRING trägt. Die einzelnen Parameter sind hier durch &-Zeichen voneinander getrennt. Es ist Aufgabe des Programmierers, die Parameter aus dieser Variable in brauchbare Information zu verwandeln.

Die POST-Methode übergibt die Parameter direkt an die Standard-Eingabe eines Programms, von wo aus sie – in dem selben Format wie bei GET – weiterverarbeitet werden können.

Umgebungsvariablen

Der Webserver stellt neben der Variable $QUERY_STRING einen ganzen Satz Umgebungsvariablen zur Verfügung, aus denen z.B. die IP-Adresse des Clients und viele anderen Angaben ersichtlich sind. Mit einem einfachen Perlscript sind diese Variablen darstelbar:

#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "%lt;body bgcolor=white>
foreach $var (sort(keys(%ENV))) {
    $val = $ENV{$var};
    $val =~ s|\n|\\n|g;
    $val =~ s|"|\\"|g;
    print "${var}=\"${val}\"<br>\n";
}