Modification de PATH_INFO dans l'environnement CGI


Vue d'ensemble

Telle qu'elle était implémentée dans les versions antérieures à la version 1.1.1 d'Apache (comprise), la méthode utilisée par Apache pour créer la variable PATH_INFO dans l'environnement CGI était loin d'être intuitive, et pouvait conduire à certaines défaillances dans certains cas. A partir de la version 1.2 d'Apache, cette méthode a été modifiée. Bien que ces modifications puissent conduire à certaines incompatibilités avec certaines applications CGI, le comportement d'Apache 1.2 reste toujours compatible avec la spécification CGI/1.1, et les scripts CGI restent facilement modifiables (voir ci-dessous).

Le Problème

Les versions d'Apache jusqu'à 1.1.1 construisaient les variables d'environnement CGI PATH_INFO et SCRIPT_NAME en inspectant les noms de fichiers, et non les URL. Bien que cette technique conduise à des valeurs correctes dans la plupart des cas, il pouvait arriver que le chemin défini par le système de fichiers soit surchargé par une redéfinition, laquelle conduisait à une mauvaise interprétation lors de la constitution des variables. Par exemple, si la ligne suivante apparaissait dans un fichier de configuration :

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

Dans ce cas, user.cgi désigne le script CGI, la chaîne "/ralph" est une information à passer au CGI. Si cette configuration était en place, et qu'une requête vers "/cgi-ralph/script/" était reçue, le code du serveur aurait constitué une variable PATH_INFO de valeur "/ralph/script", et SCRIPT_NAME de valeur "/cgi-". Il est évident de constater que la deuxième variable est fausse. Dans certains cas, cela aurait même pu conduire à un arrêt du serveur.

La Solution

Les versions postérieures à 1.2 d'Apache définissent maintenant les variables SCRIPT_NAME et PATH_INFO en inspectant directement l'URL, et en déterminant quelle portion de l'URL est modifiable par le client. PATH_INFO est initialisé à cette partie modifiable. Pour réexploiter l'exemple ci-dessus, PATH_INFO prendrait maintenant la valeur "/script", et SCRIPT_NAME la valeur correcte "/cgi-ralph". Il n'y a plus de problème de comportement du serveur dans ce cas. Cela permet en outre de garantir l'accessibilité de l'URL http://$SERVER_NAME:$SERVER_PORT$SCRIPT_NAME$PATH_INFO" laquelle pointe sur le script courant. Ce n'était pas nécesairement vrai dans les versions précédentes d'Apache.

Toutefois, l'information "/ralph" de la directive Alias est perdue. Nous pensions que l'utilisation du système de fichiers pour faire passer ce genre d'information n'était pas une méthode recommandée, et un script utilisant ce principe était de toutes façons à éviter. Nous avons ajouté malgré tout à partir de la version 1.2b3 d'Apache une façon de contourner cette restriction.

Compatibilité avec des serveurs plus anciens

Il se peut que certains scripts écrits pour des versions antérieures d'Apache ou pour d'autres serveurs aient besoin d'exploiter les informations données dans l'ancien modèle de variable PATH_INFO. A cet effet, la version 1.2 d'Apache (1.2b3 et postérieures) proposent une variable supplémentaire, appelée FILEPATH_INFO. Cette nouvelle variable d'environnement contient la valeur qui était précédemment inscrite dans PATH_INFO par la version 1.1.1 d'Apache.

Un script désirant être compatible avec toutes les versions d'Apache peut simplement tester l'existence de la variable FILEPATH_INFO, et utiliser cette variable si besoin est. Autrement, il récupérera ses informations dans la variable PATH_INFO. Par exemple, en Perl, on pourra écrire :

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

Par cette écriture, un script fonctionnera avec tous les serveurs conformes à la spécification CGI/1.1, incluant par là même toutes les versions d'Apache.