26.5. Fonctionnement des scripts CGI

L'interface CGI (Common Gateway Interface) d'Apache permet de créer du contenu dynamique avec des programmes ou des scripts que l'on appelle généralement des scripts CGI. Les scripts CGI peuvent être écrits dans n'importe quel langage de programmation. Généralement, on utilise des langages de script tels que Perl ou PHP.

Pour permettre à Apache de fournir du contenu créé par des scripts CGI, mod_cgi doit être activé. mod_alias est également nécessaire. Par défaut, ces deux modules sont activés. Reportez-vous à la Section 26.4.2, « Activation et désactivation » pour des informations détaillées sur l'activation des modules.

[Warning]sécurité CGI

Le fait d'autoriser le serveur à exécuter des scripts CGI constitue une faille de sécurité potentielle. Pour plus d'informations, reportez-vous à la Section 26.7, « Comment éviter les problèmes de sécurité ».

26.5.1. Configuration d'Apache

Dans SUSE Linux, l'exécution de scripts CGI n'est autorisée que dans le répertoire /srv/www/cgi-bin/. Cet emplacement est déjà configuré pour exécuter les scripts CGI. Si vous avez créé une configuration d'hôte virtuel (reportez-vous à Section 26.2.1.2, « Configuration de l'hôte virtuel ») et si vous souhaitez placer vos scripts dans un répertoire spécifique de l'hôte, vous devez déverrouiller et configurer ce répertoire.

Exemple 26.5. VirtualHost Configuration CGI

ScriptAlias /cgi-bin/ "/srv/www/example.com_cgi-bin/"1

<Directory "/srv/www/example.com_cgi-bin/">
 Options +ExecCGI2
 AddHandler cgi-script .cgi .pl3
 Order allow,deny4
 Allow from all
</Directory>
    
1

Indique à Apache qu'il doit gérer tous les fichiers de ce répertoire comme des scripts CGI.

2

Active l'exécution du script CGI

3

Indique au serveur qu'il doit traiter les fichiers portant les extensions .pl et .cgi comme des scripts CGI. Ajustez les réglages en fonction de vos besoins.

4

Les directives Order et Allow contrôlent l'état d'accès par défaut et l'ordre dans lequel les directives Allow et Deny sont évaluées. Dans ce cas, les instructions « deny » sont évaluées avant les instructions « allow » et l'accès de partout est activé.

26.5.2. Exécution d'un exemple de script

La programmation CGI est différente de la programmation "classique". En effet, les programmes et les scripts CGI doivent être précédés d'un en-tête de type MIME tel que Content-type: text/html. Cet en-tête est envoyé au client, afin qu'il comprenne le type de contenu qu'il reçoit. Ensuite, la sortie du script doit être quelque chose que le client, généralement un navigateur Web, comprend : du HTML dans la plupart des cas ou du texte brut ou des images, par exemple.

Un simple script de test disponible sous /usr/share/doc/packages/apache2/test-cgi fait partie du paquetage d'Apache. Il sort le contenu de certaines variables d'environnement en texte brut. Copiez ce script dans /srv/www/cgi-bin/ ou dans le répertoire de script de votre hôte virtuel (/srv/www/example.com_cgi-bin/) et nommez-le test.cgi.

Les fichiers accessibles par le serveur Web doivent être détenus par l'utilisateur root (reportez-vous à la Section 26.7, « Comment éviter les problèmes de sécurité » pour obtenir des informations supplémentaires). Du fait que le serveur Web s'exécute avec un utilisateur différent, les scripts CGI doivent être exécutables et lisibles par n'importe quel utilisateur. Accédez au répertoire CGI et utilisez la commande chmod 755 test.cgi pour appliquer les autorisations requises.

Appelez maintenant http://localhost/cgi-bin/test.cgi ou http://example.com/cgi-bin/test.cgi. Le « rapport de script de test CGI/1.0 » doit s'afficher.

26.5.3. Dépannage

Si vous ne voyez pas la sortie du programme de test mais un message d'erreur à la place, vérifiez ce qui suit :

Dépannage de CGI

  • Avez-vous rechargé le serveur après avoir modifié la configuration ? Vérifiez avec rcapache2 probe.

  • Si vous avez configuré votre répertoire CGI personnalisé, est-il correctement configuré ? En cas de doute, essayez le script du répertoire CGI par défaut /srv/www/cgi-bin/ et appelez-le avec http://localhost/cgi-bin/test.cgi.

  • Les droits d'accès aux fichiers sont-ils corrects ? Accédez au répertoire CGI et exécutez la commande ls -l test.cgi. Sa sortie doit commencer par

    -rwxr-xr-x  1 root root
         
  • Assurez-vous que le script ne contient pas d'erreurs de programmation. Si vous n'avez pas changé test.cgi, cela ne doit pas être le cas. Toutefois, si vous utilisez vos propres programmes, vérifiez toujours qu'ils ne contiennent pas d'erreurs de programmation.