PATH_INFO - Änderungen in der CGI-Umgebung

Beim Apache 1.1.1 und früheren Versionen, war das Verfahren zum Erzeugen von PATH_INFO in der CGI-Umgebung nicht problemlos und konnte in bestimmten Situationen zum Absturz führen. Mit der Apache-Version 1.2 hat sich dieses Verhalten geändert. Das führte zwar in einigen Fällen zu Kompatibilitätsproblemen mit bestimmten herkömmlichen CGI-Anwendungen, die Apache-Version 1.2 ist aber kompatibel zur CGI-Spezifikation 1.1 und CGI-Skripte sind einfach zu anzupassm (siehe unten ).

Das Problem

Der Apache-Server Version 1.1.1 und frühere Versionen implementierten die Umgebungsvariablen PATH_INFO und SCRIPT_NAME über den Dateinamen und nicht mit der URL. Das führte zwar in vielen Fällen zu richtigen Ergebnissen, lagen jedoch umfangreiche Pfadinformationen vor, dann konnte das zu einem fehlerhaften Verhalten führen. Zum Beispiel konnte die Konfigurationsdatei folgende Zeile enthalten:

Alias /cgi-ralph /usr/local/httpd/cgi-bin/user.cgi/ralph

In diesem Fall ist user.cgi das CGI-Skript und /ralph die CGI zu übergebende Information. Kam bei dieser Konfiguration eine Anfrage nach /cgi-ralph/script/, setzte der Code PATH_INFO auf /ralph/script und SCRIPT_NAME auf /cgi-, wobei letzteres offensichtlich nicht korrekt ist. Unter bestimmten Umständen konnte dies sogar zu einem Server-Absturz führen.

Die Lösung

Seit der Apache-Version 1.2 werden SCRIPT_NAME und PATH_INFO direkt über die URL bestimmt und festgestellt, wieviel der URL vom Client modifiziert werden kann und PATH_INFO dieser Wert zugewiesen. Im oben angeführten Beispiel wird PATH_INFO auf /script und SCRIPT_NAME auf /cgi-ralph gesetzt. Das ist sinnvoll und bereitet dem Server keine Probleme. Außerdem wird dadurch garantiert, dass http://$SERVER_NAME:$SERVER_PORT$SCRIPT_NAME $PATH_INFO immer eine zulässige URL ist, die auf das aktuelle Skript verweist, was bei früheren Versionen nicht unbedingt zutraf.

Allerdings geht die Information /ralph aus der Alias-Direktive verloren. Das ist bedauerlich, aber das Dateisystem zum Weiterreichen dieser Art von Informationen zu nutzen, ist nicht empfehlenswert und funktioniert in Verbindung mit Skripten nicht. Seit der Apache-Version 1.2b3 gibt es jedoch einen Workaround.

Kompatiblität zu älteren Servern

Ein Skript, das für frühere Apache-Versionen oder andere Server entwickelt wurde benötigt möglicherweise die Informationen, die die alte Variable PATH_INFO enthielt. Aus diesem Grund wird seit der Version 1.2 außerdem die Variable FILEPATH_INFO gesetzt. Diese Umgebungsvariable enthält den Wert, den PATH_INFO unter Apache 1.1.1 hätte.

Soll ein Skript mit alten und neuen Versionen funktionieren, wird einfach das Vorhandensein der Variablen FILEPATH_INFO abgefragt und falls vorhanden benutzt. Andernfalls wird PATH_INFO benutzt. In Perl können Sie beispielsweise folgende Anweisung benutzen:

$path_info = $ENV{'FILEPATH_INFO'} || $ENV{'PATH_INFO'};

Auf diese Weise funktioniert ein Skript mit allen Servern, die die CGI-Spezifikation 1.1 unterstützen sowie mit allen Versionen des Apache.