Perl-Programmierung: CGI


Einleitung

Bearbeiten

Das Common Gateway Interface ( CGI ) bietet die Möglichkeit, seine Scripts auf Webservern, welche diese Technologie unterstützen, auszuführen. Neben Perl können solche CGI-Scripts auch in vielen anderen Sprachen geschrieben sein, jedoch werden wir, da es sich schließlich um ein Perl-Wikibook handelt, lediglich auf selbiges näher eingehen. Zwar gibt es mittlerweile mit PHP und Co. gute Alternativen zu CGI-Scripts, jedoch findet man im WWW immer noch zahlreiche Anwendungsmöglichkeiten. Ein Perl-Modul um das alles zu realisieren ist CGI[1].

Allerdings wurde dieses Modul ab der Perl-Version 5.22 aus dem Kern entfernt (es kann aber, wie jedes andere CPAN-Modul, zusätzlich installiert werden). Der Grund für diese Entscheidung ist, dass CGI.pm ist nicht mehr als gute Praxis für die Entwicklung von Web-Anwendungen - einschließlich schnellem Prototyping und kleinen Web-Skripten - betrachtet werden kann. Es gibt zahlreiche bessere und modernere Alternativen. Sie werden verglichen und dokumentiert in CGI::Alternatives[2].

Wie funktioniert CGI

Bearbeiten

Um zu verstehen, wie CGI funktioniert, muss man verstehen, wie Webserver mit Anfragen umgehen. Eine typische Anfrage an einen Webserver sieht in etwa so aus:

 GET /test.html HTTP/1.1
 Host: www.blubb.com

Hier wird der Webserver darum gebeten die Datei test.html anzufordern und dem Client zu präsentieren. Der Webserver antwortet darauf, je nachdem, ob die Seite eben existiert oder nicht, mit verschiedenen Codes. Wir nehmen jetzt an die Seite existiert:

 HTTP/1.1 200 OK
 Server: Apache/1.3.29 (Unix) PHP/4.3.4
 Content-Length: Größe von test.html in Byte
 Content-Language: de
 Content-Type: text/html
 Connection: close
 
 ... Inhalt von test.html ... 

Der Inhalt von test.html wird dann vom jeweiligen Browser in eine menschenlesbare Form gebracht und dargestellt.

Sollte der Webserver bemerken, dass es sich bei der angeforderten Ressource um ein CGI-Script handelt, was er daran merkt, dass sich das File im jeweiligen cgi-bin-Verzeichnis befindet, führt er das Script aus und gibt dessen Output direkt an den Browser weiter. Hier ein typischer Ablauf:

 GET /cgi-bin/test.cgi HTTP/1.1
 ...

In diesem Fall erkennt der Webserver das cgi-bin im Request. Viele Webspace-Anbieter verlangen, dass CGI-Scripts in eben diesem Verzeichnis gespeichert sind und verbieten die Ausführung von Scripts die nicht in diesem Verzeichnis liegen.

Einführendes Beispiel ohne CGI-Modul

Bearbeiten

Rein theoretisch ist es nicht notwendig, das CGI-Modul einzubinden. Man könnte es, wie in folgendem Beispiel zu sehen, auch ohne Einbindung des Moduls zum gewünschten Ergebnis kommen.

#!/usr/bin/perl
use strict;

print "Content-Type: text/html\n\n";
print "<html>\n";
print "<head><title>Testpage</title></head>\n";
print "<body>\n";
print "<h1>Test</h1>\n";
print "</body>\n";
print "</html>\n";


Nachdem man dieses Script ausführbar gemacht hat und es ins jeweilige cgi-bin-Verzeichnis kopiert hat, sollte man es via Browser ansteuern können und eine Überschrift namens "Test" sehen.


Was geschieht hier?


Der Webserver erkennt, dass es sich um ein CGI-Script handeln muss ( wegen Verzeichnis cgi-bin ) und führt es aus. Der Output wird direkt an den Browser weitergegeben. Die Anweisung print "Content-Type: text/html\n\n"; erklärt dem Browser, worauf er sich einstellen kann. In diesem Fall also auf ein HTML-Dokument. Der Rest sollte eigentlich, so fern man ein wenig HTML-Erfahrung hat, selbsterklärend sein.

Einführendes Beispiel mit CGI-Modul

Bearbeiten

"Wozu brauche ich dieses Modul dann überhaupt?!" könnte der ein oder andere nun fragen. Nun, für manche Anwendungen scheint das CGI-Modul wirklich sinnlos zu sein, jedoch nur auf den ersten Blick. Denn manche Dinge sind mit dem CGI-Modul schlichtweg einfacher zu realisieren. Hier das vorherige Beispiel nochmals, jedoch diesmal mit Einbindung des CGI-Moduls:

#!/usr/bin/perl
use strict;
use CGI qw/:standard/;

print header();
print start_html(-title => 'Testpage');
print h1('Test');
print end_html();

Sieht doch gleich kompakter aus, oder nicht? Aber was passiert hier?

Zuerst wird dem Browser mittels header der Header gesendet. Dies ist im Grunde das selbe, wie im vorherigen Beispiel die print-Anweisung mit dem Content-Type. Danach wird mit start_html der HTML-Header erstellt. Das bedeutet, alle optionalen Anweisungen des <head>-Teils können hier hineingepackt werden. Mehr dazu später. Zuletzt schreibt start_html noch das <body>. Somit befinden wir uns ab jetzt im sichtbaren Teil des HTML-Dokuments. Die h1-Funktion gibt, wie erwartet, eine <h1>-Überschrift aus. Mit end_html wird das HTML-Dokument abgeschlossen, es entspricht also </html>.

  1. CGI im CPAN: CGI
  2. http://search.cpan.org/~leejo/CGI-Alternatives-0.14/lib/CGI/Alternatives.pm