[Cologne-pm] Include

A. Pagaltzis pagaltzis at gmx.de
Tue Jun 5 02:40:54 PDT 2007


* quarky at quantentunnel.de <quarky at quantentunnel.de> [2007-06-04 13:25]:
> ich baue eine kleine Webreport Applikation. Die Applikation
> liegt im Verzeichnis 'web'.
> 
> Das Verzeichnis 'lib' wird nicht als Verzeichnis im Web
> freigegeben. Nur das Verzeichnis 'perl' wird freigegeben.
> 
> Die Skripte innerhalb von 'perl' möchte ich durch einfaches
> Verschieben in der Ordnerhierarchie frei gruppieren können.
> 
> […]
>     +-- perl
>           +-- Report1.pl
>           +-- Report2.pl
>           +-- Business_Reports
>                 +-- Report3.pl
>           +-- Delivery_Status
>                 +-- General.pl
>                 +-- Critical
>                       +-- Report4.pl

Dieser Stil (ein CGI-Skript pro Seite) ist generell schwer zu
warten. Ich empfehle ein einziges Skript, das ausserhalb des
Document-Root liegt:

 -- web
     +-- lib
     |     +-- Modul1.pm
     |     +-- Modul2.pm
     |     +-- Library1
     |           +-- Modul3.pm
     +-- report.cgi

Das kann dann mit ScriptAlias wie folgt eingeblendet werden:

    ScriptAlias /report /pfad/nach/web/reports.cgi

Fürderhin führen dann sämtliche URIs, die mit /report im Pfad
anfangen, zum Aufruf des Skriptes, also auch sowas wie das hier:

    http://example.com/report/delivery/0815/status

Der Apache spaltet das dann auf: `/report` bedeutet, dass das
Skript aufgerufen werden soll; der Rest, also namentlich in
diesem Fall der Teil `/delivery/0814/status`, kommt vor dem
Aufruf in die Umgebungsvariable PATH_INFO. Die kannst du direkt
inspizieren oder bei Verwendung des CGI-Moduls dafür auch die
`path_info`-Methode aufrufen.

Danach kannst du offensichtlich die Addressenstruktur im Skript
interpretieren, wie es dir gerade beliebt. Du musst dazu weder
Dateien herumschieben noch die Serverkonfiguration anpassen;
Parsing von PATH_INFO im Skript entsprechend ändern genügt.

Und da es nur ein Skript an einer festen Stelle gibt, bleibt das
`lib`-Verzeichnis immer am selben relativen Pfad. Mission
accomplished. (Ausserdem können die hässlichen `.pl`-Endungen aus
den URLs verschwinden.)

(Man beachte, dass selbst ein Document-Root hierbei nicht mehr
freigegeben werden muss. Es gibt also keinerlei Dateien, die
unter irgendwelchen Umständen (etwa Fehlern in der Webserver-
konfiguration) als statische Dateien ausgeliefert würden. Es
können sich auch keine zusätzlichen Skripte in irgendwelche
freigegebenen Verzeichnisse hineinschleichen, die ein Admin
übersehen könnte.)

Noch ein Hinweis: ich empfehle, pro zu erzeugender Seite ein
Modul anzulegen; das Hauptskript parst dann nur die PATH_INFO und
entscheidet, welches Modul zu laden ist, um die eigentliche
Arbeit zu verrichten. Das wird der Wartbarkeit deiner
Codestruktur langfristig zugute kommen. Damit hast du dann
prinzipiell dieselbe Aufteilung wie jetzt, nur mit Modulen statt
einzelnen Skripten.

Wer hier schon mehr weiss, wird übrigens merken, dass dies in
Grundzügen schon die Struktur widerspiegelt, die moderne
Frameworks wie Catalyst oder Jifty aus gutem Grund vorgeben…

Gruss,
-- 
Aristoteles Pagaltzis // <http://plasmasturm.org/>


More information about the Cologne-pm mailing list