Technologies internet
CGI (Common Gateway Interface)
CGI est une interface permettant l'exécution de programmes externes par
un serveur d'information de type HTTP. Les serveurs HTTP et les
programmes CGI permettent de répondre aux requêtes des clients.
Ces requêtes, très variées, vont d'une consultation de base de données
à la prise de commande automatique ou encore à un répondeur e-mail
automatique.
Une CGI permet de faire communiquer un serveur HTTP et un programme pour
générer d'une manière dynamique des documents HTML. L'illustration la
plus commune en est l'accès à une base de données, celui-ci étant de
plus en plus fait à l'aide de PHP ou ASP. Mais l'interface CGI ne perd
pas de son intérêt car elle permet de faire communiquer n'importe quel
programme binaire avec le serveur Web et peut donc offrir beaucoup plus
de fonctionnalités que les scripts embarqués et plus rapidement.
L'inconvénient est que leur utilisation est moins simple.
Pour chaque requête correspondant à un CGI, le serveur
web va lancer un exécutable.
Exemples
- Envoi de données (avec POST) à un programme cgi
Fichier html:
<form action="http://w4.uqo.ca/cgi-bin/iglewski/4533/shell/CgiHello"
method="post">
Texte à envoyer:
<input type="text" name="TextField1">
<input type="submit" value="Envoyer"></form>
Fichier CgiHello:
#!/bin/sh
echo "Content-Type: text/plain"
echo ""
echo "Hello, world."
Installation CGI sur le serveur
Une fois le programme entré (et compilé par exemple en C), vous devez le
copier dans votre répertoire des CGI, le rendre exécutable en changeant ces
permissions:
chmod og+rx programme
- Trois simples programmes en Shell, C et Perl. Ils produisent un document
HTML contenant "Salut à tous voici mon premier script CGI":
Les entrées sorties
La communication en entrée peut se faire via des variables d'environnement ou
directement via l'entrée standard (STDIN), La sortie se fait via la sortie
standard (STDOUT) sur laquelle on envoie les informations à afficher sous forme
identifiée.
Variables d'environnement
- Variables relatives à la requête
- CONTENT_LENGTH : Taille en octets du contenu des informations
jointes à la requête en mode PUT ou POST, vide si on utilise
la méthode GET.
- CONTENT_TYPE : Type MIME des données envoyées au programme CGI
appelé par la méthode POST, vide si on utilise la méthode GET.
- QUERY_STRING : Chaîne de caractères au format URL contenant les
paramètres joints à la requête GET. Contient les données d'entrée
du programme précédées du caractère '?'. Elle est vide si on utilise
la méthode POST, a moins qu'il y ait déjà quelque chose derrière
l'URL du script.
- REQUEST_METHOD : Contient la méthode utilisée pour la requête (GET,
POST, HEAD, PUT, DELETE, LINK), sert pour déterminer la méthode
utilisée pour traiter les données.
- Variables relatives à la connexion client-serveur
- HTTP_ACCEPT : Les différents types MIME supportés par le client HTTP
(Format: type/soustype).
- HTTP_ACCEPT_LANGUAGE : Langage utilisé par le client HTTP.
- HTTP_ACCEPT_ENCODING : Type d'encodage supporté par le client HTTP.
- HTTP_ACCEPT_CHARSET : Table de caractères supportée par le client
HTTP.
- HTTP_COOKIE : Liste des 'Cookies' associés par le client HTTP à la
ressource consultée.
- HTTP_USER_AGENT : Signature du client HTTP effectuant la requête
(Format: software/version ou library/version).
- HTTP_REFERER : URL de la ressource ayant renvoyé le client HTTP sur
la requête en cours.
- REMOTE_ADDR : Adresse IP de l'ordinateur client effectuant la
requête. Cette variable permet de repérer, d'identifier des
ordinateurs et d'effectuer quelque chose en conséquence (empêcher
l'accès, donner des droits supplémentaires par exemple).
- REMOTE_HOST : Adresse DNS (nom de domaine) de l'ordinateur client
effectuant la requête. Cette variable est très utilisée pour
afficher des publicités en rapport avec le pays d'origine par
exemple.
- REMOTE_USER : Identifiant de l'utilisateur du client, lorsque le
mode d'authentification de la ressource est actif.
- AUTH_TYPE : Si le serveur supporte l'authentification et que le
script est protégé, indique le protocole utilisé pour valider
l'identité.
- REMOTE_PORT : Port utilisé par le client HTTP pour cette connexion.
Souvent absente.
- Variables relatives au serveur :
- DOCUMENT_ROOT : Nom du répertoire physique contenant la racine du
serveur consulté sur la machine.
- GATEWAY_INTERFACE : La version du standard CGI supportée par le
serveur HTTP (Format: CGI/révision).
- HTTP_HOST ou SERVER_NAME : Adresse IP ou DNS de la machine
hébergeant le serveur HTTP.
- SERVER_ADMIN : Adresse e-mail déclarée par l'administrateur du
serveur.
- SCRIPT_NAME : URL du chemin d'accès au script CGI.
- SCRIPT_FILENAME : Nom et chemin d'accès complet au CGI sur le disque
du serveur consulté.
- SERVER_PORT : Port sur lequel le serveur a réceptionné la requête
- SERVER_PROTOCOL : Nom et version du protocole utilisé par le serveur
HTTP (Format: protocol/révision).
- SERVER_SOFTWARE Nom et version du logiciel serveur HTTP utilisé.
(Format nom/version)
- TZ : Nom de la 'Time Zone' définie sur la machine du serveur HTTP.
Les entrées/sorties standards
L'entrée standard
- La méthode GET : Quand on utilise cette méthode, le programme reçoit
les données dans la variable d'environnement QUERY_STRING.
La méthode GET ne peut être utilisée que si les données d'entrées ne sont
pas trop importantes, ni confidentielles car cette méthode passe les
arguments dans l'URL donc visible, de plus la longueur d'une URL est
limitée à 1024 caractères.
- La méthode POST : Quand on utilise cette méthode, les données à traiter
sont transmises via l'entrée standard (STDIN). Le serveur n'indiquant pas
la fin de la chaîne avec un caractère spécial, il faut utiliser la
variable d'environnement CONTENT_LENGTH pour connaître la longueur
des données.
- Dans les 2 cas les données sont transmises sous forme URL-encoded;
c'est-à-dire que les espaces sont remplacés par des signes +, les
tildes (~) sont remplacés par %7E et ainsi de suite...
La sortie standard
- Le programme CGI envoie les résultats vers la sortie standard (STDOUT
soit l'écran en général). Ils peuvent être envoyés directement vers le
client HTTP ou être interprétés par le serveur qui va effectuer une
nouvelle action.
- Dans les résultats renvoyés, le serveur cherche un des 3 en-têtes que
le programme peut retourner :
- Content-type : Indique le type MIME des données. Généralement comme
les programmes CGI renvoient de l'HTML, la ligne utilisée est
Content-type: text/html\n\n. Attention à bien mettre les 2 nouvelles
lignes (\n)
- Location : Indique au serveur que l'on fait référence à un autre
document. Utilisé pour faire des redirections.
- Status : nnn XXXXXXX où nnn est un nombre à 3 chiffres et XXXXXX le
texte qui y correspond. Exemple : 404 Not found.
Autres exemples