« Apache/CGI » : différence entre les versions
Ligne 108 : | Ligne 108 : | ||
== Erreurs connues == |
== Erreurs connues == |
||
* {{rouge|Error 500 ''Erreur du serveur!''}} : remplacer un <code>Deny from all</code> par un <code>Allow from all</code>. Sinon, regarder les logs (<code>tail /var/log/apache2/error.log</code>) ; ex : <code>suexec policy violation</code>). |
* {{rouge|Error 500 ''Erreur du serveur!''}} : remplacer un <code>Deny from all</code> par un <code>Allow from all</code>. Sinon, regarder les logs (<code>tail /var/log/apache2/error.log</code>) ; ex : <code>suexec policy violation</code> => commenter la directive <code>SuexecUserGroup</code>). |
||
* {{rouge|Error 403 ''Accès interdit''}} : lister ce répertoire est interdit, il faut donc connaitre l'URL des fichiers qu'il contient. |
* {{rouge|Error 403 ''Accès interdit''}} : lister ce répertoire est interdit, il faut donc connaitre l'URL des fichiers qu'il contient. |
||
* Le code source du fichier à exécuter s'affiche dans le navigateur, ou ce dernier propose de le télécharger : le <code>Addhandler</code> est manquant (exemple dans le .htaccess ci-dessus). Sinon c'est le module qui n'est pas activé (a2enmod cgi). |
* Le code source du fichier à exécuter s'affiche dans le navigateur, ou ce dernier propose de le télécharger : le <code>Addhandler</code> est manquant (exemple dans le .htaccess ci-dessus). Sinon c'est le module qui n'est pas activé (a2enmod cgi). |
Version du 24 septembre 2015 à 16:58
Le CGI (Common Gateway Interface) est une norme permettant à Apache d'exécuter des programmes écrits en n'importe quel langage (Bash, C, Java, Perl, PHP, Python...), du moment qu'il est exécutable et qu'il respecte certaines contraintes d'entrées/sortie.
Configurer l'accès aux scripts CGI
Pour qu'Apache prenne en charge les scripts, il est nécessaire d'effectuer un minimum de paramétrage dans la configuration du site.
Activer le module
a2enmod cgi
ScriptAlias
La directive (de httpd.conf) :
ScriptAlias /cgi-bin/ /chemin des scripts/
précise le nom du répertoire où Apache est autorisé à exécuter des scripts CGI[1].
Exemple Unix :
ScriptAlias /cgi-bin/ /var/www/cgi-bin
Exemple Windows, utiliser le format URL (pas d'antislash) :
ScriptAlias /cgi-bin/ "C:/wamp/bin/apache/apache2.2.27/cgi-bin/"
En fait le chemin /cgi-bin/
n'existe pas vraiment, il est dirigé vers le chemin des scripts défini par la directive, et cela permet d'écrire des URL comme http://serveur/cgi-bin/mon_script
.
ExecCGI
La clause suivante active l'option ExecCGI
dans /var/www/cgi-bin
, ce qui autorise Apache à exécuter les scripts sur le serveur :
<Directory /var/www/cgi-bin> Options ExecCGI </Directory>
Par exemple : vous écrivez un script essai.cgi
, et vous voulez que /home/httpd/cgi-bin
contienne les scripts.
Il faut donc au moins écrire :
<Directory /home/httpd/cgi-bin> Options ExecCGI </Directory>
L'appel à un script essai.cgi sera effectué par l'URL : http://serveur/cgi-bin/essai.cgi
AddHandler
Cette clause permet de choisir les extensions de fichiers qui seront autorisés, ex :
AddHandler cgi-script .cgi .exe .pl .py .vbs
Récapitulatif
Exemple complet sur Windows, dans la configuration Apache :
ScriptAlias /cgi-bin/ "E:/www/cgi-bin/" <Directory "E:/www/cgi-bin/"> Options FollowSymLinks Indexes AllowOverride All Order deny,allow Allow from all Require all granted </Directory>
Dans E:/www/cgi-bin/.htaccess
:
AddHandler cgi-script .cgi .exe .pl .py .vbs
Écrire un programme CGI
La contrainte principale concerne la sortie du programme. Si un programme CGI génère des données sur sa sortie standard, il doit les précéder d'un en-tête HTTP permettant de les identifier.
Bash
Voici un exemple de programme CGI écrit en bash :
#!/bin/bash
# Header
echo "Content-type: text/html"
# Fin du header
echo ""
# Contenu à afficher dans le navigateur
echo "<html><body>Hello World!</body></html>"
Ce script génère une page HTML.
Perl
#!c:/perl/perl/bin/perl.exe -w
use CGI;
my $query = new CGI;
my $Name = $query->param('Name');
print $query->header();
print "Hello World!"
Python
#!C:\Program Files (x86)\Python\python.exe
# -*- coding: UTF-8 -*-
print "Content-Type: text/plain;charset=utf-8"
print
print "Hello World!"
- Pour plus de détails voir : Programmation Python/L'interface CGI.
VBS
Pour Windows[2].
'!c:/windows/system32/cscript //nologo
Wscript.Echo "Content-type: text/html" & vbLF & vbLF
WScript.Echo "Hello World!"
Wscript.Quit 0
Erreurs connues
- Error 500 Erreur du serveur! : remplacer un
Deny from all
par unAllow from all
. Sinon, regarder les logs (tail /var/log/apache2/error.log
) ; ex :suexec policy violation
=> commenter la directiveSuexecUserGroup
). - Error 403 Accès interdit : lister ce répertoire est interdit, il faut donc connaitre l'URL des fichiers qu'il contient.
- Le code source du fichier à exécuter s'affiche dans le navigateur, ou ce dernier propose de le télécharger : le
Addhandler
est manquant (exemple dans le .htaccess ci-dessus). Sinon c'est le module qui n'est pas activé (a2enmod cgi). - couldn't create child process : remplacer le chemin après le shebang. Par exemple :
#!/usr/bin/perl
par#!c:/perl/perl/bin/perl.exe -w
.#!/usr/bin/env python
par#!C:\Program Files (x86)\Python\python.exe
.
- End of script output before headers : en-tête manquante dans le contenu affiché par le script (ex : déplacer l'importation avant
print "Content-Type: text/plain;charset=utf-8"
). Mais cela peut aussi être dû à un message d'erreur dans le script à exécuter. - malformed header from script: Bad header: : l'en-tête n'est pas adaptée (ex : remplacer
#print "Content-Type: text/plain;charset=utf-8"
parprint "Content-type: text/html\n\n"
s'il y a unprint "<html>"
après).
Sinon consulter les logs Apache...