Zum Inhalt springen

Apache/14 CGI/2 Konfiguration/2 Aktivieren

Aus Foxwiki
Version vom 29. März 2025, 23:06 Uhr von Dirkwagner (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „=== 14.2.1 CGI-Verzeichnisse === Standardmäßig ist die Ausführung von CGI-Skripten in der DocumentRoot einer Website nicht aktiviert. Stattdessen gibt es in der Normalkonfiguration ein separates Verzeichnis, das sich aus Sicherheitsgründen außerhalb des Website-Verzeichnisses befindet. Dieses Verzeichnis wird durch die Direktive ScriptAlias aus dem Modul mod_alias bereitgestellt. ScriptAlias Bildet ein Verzeichnis unter den Verzeichnisbaum der Webs…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

14.2.1 CGI-Verzeichnisse

Standardmäßig ist die Ausführung von CGI-Skripten in der DocumentRoot einer Website nicht aktiviert. Stattdessen gibt es in der Normalkonfiguration ein separates Verzeichnis, das sich aus Sicherheitsgründen außerhalb des Website-Verzeichnisses befindet. Dieses Verzeichnis wird durch die Direktive ScriptAlias aus dem Modul mod_alias bereitgestellt.

ScriptAlias

Bildet ein Verzeichnis unter den Verzeichnisbaum der Website ab und aktiviert darin CGI-Skripte.

Modul mod_alias
Kontext Server, <VirtualHost>
Syntax ScriptAlias URL-Pfad Dateisystem-Pfad
Standardwert nicht gesetzt

Der traditionelle Name des CGI-Verzeichnisses ist cgi-bin. Bei einer normalen Apache-Installation wird dieses Verzeichnis unter der ServerRoot angelegt und mit einer Anweisung wie dieser in das htdocs-Verzeichnis abgebildet:

ScriptAlias /cgi-bin/ /usr/local/apache2/cgi-bin/

Ein Zugriff auf die URL http://www.mynet.de/cgi-bin/skript.pl spricht dann in Wirklichkeit das Skript /usr/local/apache2/cgi-bin/skript.pl an.

Im Grunde ist diese Direktive nur eine Abkürzung für folgende Schreibweise:

Alias /cgi-bin/ /usr/local/apache2/cgi-bin/
<Directory "/usr/local/apache2/cgi-bin/">
SetHandler cgi-script
</Directory>

Bei einem Verzeichnis, das mithilfe der Direktive ScriptAlias eingebunden wird, gelten die enthaltenen Dateien daher automatisch als CGI-Skripte und werden vom Server auch so behandelt. Aus diesem Grund benötigen sie keine spezielle Dateiendung. CGI-Skripte müssen aber stets einige andere spezielle Voraussetzungen erfüllen:

  • Auf einem UNIX-System müssen sie als ausführbar für alle Benutzer gekennzeichnet sein. Sie müssen also nach dem Erstellen eines solchen Skripts das

folgende Dateirecht setzen:

# chmod a+x skript.pl

Unter Windows entfällt dieser Schritt; diese Art von Dateirechten existiert hier nicht.

  • Falls es sich um ein interpretiertes Skript handelt, muss dem Webserver mitgeteilt werden, welcher Interpreter für seine Ausführung zuständig ist. Die

traditionelle UNIX-Methode dafür ist die Shebang in der ersten Zeile des Skripts. Sie gibt den vollständigen Pfadnamen des Programms an, z.B.:

#!/usr/bin/perl

Windows kennt diesen Mechanismus eigentlich nicht. Hier entscheidet normalerweise allein die Dateiendung darüber, welches Programm ein Dokument oder Skript öffnen soll. Apache benötigt allerdings auch hier die Shebang-Zeile, um die Zuordnung vorzunehmen (es sei denn, Sie ändern die weiter unten beschriebene spezielle Win32-Konfigurationsdirektive ScriptInterpreterSource). Deshalb ist dies eine der wichtigsten Anpassungen, die Sie an einem Perl-CGI-Skript vornehmen müssen, das ursprünglich für UNIX geschrieben wurde.

Beispiel
#!C:/Perl/bin/perl.exe

Ein kompiliertes, binäres Programm braucht sich natürlich nicht an diese Regel zu halten, da es für sich selbst ausgeführt werden kann. Solche Programme werden aber in der Praxis eher selten als CGIs eingesetzt, zum einen

Apache für CGI-Skripte konfigurieren 14.2

aus Sicherheitsgründen und zum anderen, weil andere Sprachen praktischere Hilfsmittel für die CGI-Programmierung enthalten.

  • Wie bereits erwähnt, muss sich das CGI-Programm nicht nur um die Erzeugung eines vollständigen (meist HTML-)Dokuments auf der Standardausgabe

kümmern, sondern auch die nötigen HTTP-Antwort-Header selbst generieren. Die Mindestanforderung ist ein Content-Type-Header mit einem zur Ausgabe passenden MIME-Type. Hinter den Headern muss bekanntermaßen eine Leerzeile folgen.

Wenn Sie gleich eine ganze Gruppe von Verzeichnissen nach diesem Schema CGI-fähig machen möchten, können Sie dazu die Direktive ScriptAliasMatch verwenden.

ScriptAliasMatch Bildet eine durch einen regulären Ausdruck beschriebene Gruppe von Verzeichnissen in die Website ab und aktiviert in ihnen CGI-Skripte.

Modul mod_alias Kontext Server, <VirtualHost> Syntax ScriptAliasMatch URL-Pfadmuster Dateisystem-Pfadmuster Standardwert nicht gesetzt

Um das Verhalten der Standardkonfiguration der Direktive ScriptAlias mithilfe von ScriptAliasMatch nachzuahmen, können Sie die folgende Formulierung verwenden:

ScriptAliasMatch ^/cgi-bin(.*) /usr/local/apache2/cgi-bin$1

Diese Verwendung von ScriptAliasMatch bringt zwar keinen praktischen Nutzen, demonstriert aber das Prinzip: Muster, die dem URL-Pfad (erster Parameter) entsprechen, werden auf den im zweiten Parameter angegebenen Pfad umgesetzt. Geklammerte Ausdrücke aus dem URL-Muster können dabei wie gewohnt als $1, $2 usw. im Ersetzungsteil verwendet werden. Einen kurzen Überblick über reguläre Ausdrücke finden Sie in Anhang G.

Hier noch drei praxistauglichere Beispiele:

  • Angenommen, Sie haben CGI-Skripte für verschiedene Aufgaben und wollen

diese in unterschiedlichen Verzeichnissen ablegen. Die Verzeichnisse heißen cgi-bin0 bis (maximal) cgi-bin9 und befinden sich unterhalb der ServerRoot. Natürlich ist es kein Problem, sie mit einzelnen ScriptAlias-Direktiven wie den folgenden einzubinden:

14 CGI

ScriptAlias /cgi-bin0/ /usr/local/apache2/cgi-bin0/ ScriptAlias /cgi-bin1/ /usr/local/apache2/cgi-bin1/ [...] ScriptAlias /cgi-bin9/ /usr/local/apache2/cgi-bin9/

Sehr effizient ist diese Lösung allerdings nicht; außerdem könnte es auch passieren, dass Sie nicht 10, sondern 100 Verzeichnisse auf diese Weise behandeln müssen. Mit einer ScriptAliasMatch-Direktive lässt sich dies in einem Schritt erledigen:

ScriptAliasMatch ^/cgi-bin([0-9])/(.*) \ /usr/local/apache2/cgi-bin$1/$2

  • Wenn Sie CGI-Skripte haben, die in mehreren Sprachen geschrieben sind (in

diesem Beispiel Perl, Shell-Skripte und binäre C-Programme), möchten Sie diese möglicherweise in unterschiedlichen Verzeichnissen wie cgi-perl, cgish und cgi-bin (eben Binaries!) speichern. Mit ScriptAliasMatch lässt sich dies folgendermaßen erledigen:

ScriptAliasMatch ^/cgi-((perl)|(sh)|(bin))/(.*) \ /usr/local/apache2/cgi-$1/$5

  • Angenommen, Ihre Website besitzt drei interaktive Bereiche: einen datenbankgestützten Katalog, einen Shop und ein Diskussionsforum. Diese Bereiche befinden sich unter www.mynet.de/katalog, www.mynet.de/shop beziehungsweise www.mynet.de/forum. Jeder dieser Bereiche soll sein eigenes CGIVerzeichnis erhalten; die URLs dieser Verzeichnisse sollen von außen als

www.mynet.de/katalog/cgi-bin usw. angesprochen werden, in Wirklichkeit aber unter der ServerRoot in Verzeichnissen wie cgi-bin/katalog liegen. Das Konzept soll von vornherein verallgemeinert werden – alle URLs nach dem Schema www.mynet.de/[a-z]+/cgi-bin sollen in entsprechende CGI-Verzeichnisse umgeleitet werden:

ScriptAliasMatch ^/([a-z]+)/cgi-bin/(.*) \ /usr/local/apache2/cgi-bin/$1/$2