CGI script : 404 not found
Utilisateur anonyme
-
Utilisateur anonyme -
Utilisateur anonyme -
Bonjour,
Je ne souhaite pas créer un site mais simplement pouvoir exécuter des scripts cgi sur requête HTTP. Pour ça j'ai installé LAMP sur ma machine virtuelle sous Ubuntu 14.04 LTS.
Je comptais utiliser la configuration par défaut du serveur Apache2 mais il y a quelque chose qui m'échappe car je place bien mon script cgi dans le dossier mentionné dans les fichiers de configuration et je n'arrive pas à obtenir autre chose qu'un 404 Not Found.
Je ne trouve d'ailleurs aucun tuto sur internet pour un besoin aussi simple que le mien ; tous expliquent comment configurer Apache2 pour, par exemple, utiliser un autre dossier racine, changer les droits d'accès, désactiver la page par défaut, etc.
Voici le contenu du fichier (par défaut) /etc/apache2/conf-available/serve-cgi-bin.conf
Et le contenu du fichier (par défaut) /etc/apache2/mods-available/alias.load
Et le contenu du fichier (par défaut) /etc/apache2/mods-available/cgi.load
Ce qui me semble indiquer que je dois simplement placer mon script cgi dans le dossier /usr/lib/cgi-bin pour qu'il soit pris en compte et exécuté quand je le requête.
Pour plus d'informations sur mon script :
Lorsque je requête http://localhost/ dans le navigateur de la machine virtuelle, ou http://192.168.56.101/ dans le navigateur de la machine hôte j'obtiens bien la page "Apache2 Ubuntu Default Page".
Mais quand je requête /cgi-bin/hello.cgi (dans la machine virtuelle ou depuis l'hôte), j'obtiens toujours une page 404 Not Found.
Est-ce que quelqu'un sait me dire ce qu'il manque pour que ça fonctionne ?
Je ne souhaite pas créer un site mais simplement pouvoir exécuter des scripts cgi sur requête HTTP. Pour ça j'ai installé LAMP sur ma machine virtuelle sous Ubuntu 14.04 LTS.
Je comptais utiliser la configuration par défaut du serveur Apache2 mais il y a quelque chose qui m'échappe car je place bien mon script cgi dans le dossier mentionné dans les fichiers de configuration et je n'arrive pas à obtenir autre chose qu'un 404 Not Found.
Je ne trouve d'ailleurs aucun tuto sur internet pour un besoin aussi simple que le mien ; tous expliquent comment configurer Apache2 pour, par exemple, utiliser un autre dossier racine, changer les droits d'accès, désactiver la page par défaut, etc.
Voici le contenu du fichier (par défaut) /etc/apache2/conf-available/serve-cgi-bin.conf
<IfModule mod_alias.c> <IfModule mod_cgi.c> Define ENABLE_USR_LIB_CGI_BIN </IfModule> <IfModule mod_cgid.c> Define ENABLE_USR_LIB_CGI_BIN </IfModule> <IfDefine ENABLE_USR_LIB_CGI_BIN> ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ <Directory "/usr/lib/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Require all granted </Directory> </IfDefine> </IfModule>
Et le contenu du fichier (par défaut) /etc/apache2/mods-available/alias.load
LoadModule alias_module /usr/lib/apache2/modules/mod_alias.so
Et le contenu du fichier (par défaut) /etc/apache2/mods-available/cgi.load
LoadModule cgi_module /usr/lib/apache2/modules/mod_cgi.so
Ce qui me semble indiquer que je dois simplement placer mon script cgi dans le dossier /usr/lib/cgi-bin pour qu'il soit pris en compte et exécuté quand je le requête.
Pour plus d'informations sur mon script :
xxxxxxx@xxxxxxx:/usr/lib/cgi-bin$ ll -a
total 36
drwxr-xr-x 2 root root 4096 juin 21 10:19 ./
drwxr-xr-x 137 root root 28672 juin 21 09:52 ../
-rwxr-xr-x 1 xxxxxxx xxxxxxx 68 juin 21 11:11 hello.cgi*
xxxxxxx@xxxxxxx:/usr/lib/cgi-bin$ cat hello.cgi
#!/bin/bash
echo "Content-type: text/html"
echo
echo "Helloworld"
Lorsque je requête http://localhost/ dans le navigateur de la machine virtuelle, ou http://192.168.56.101/ dans le navigateur de la machine hôte j'obtiens bien la page "Apache2 Ubuntu Default Page".
Mais quand je requête /cgi-bin/hello.cgi (dans la machine virtuelle ou depuis l'hôte), j'obtiens toujours une page 404 Not Found.
Est-ce que quelqu'un sait me dire ce qu'il manque pour que ça fonctionne ?
A voir également:
- 404 not found : la route demandée ('rms.orange.fr') n'existe pas.
- Script vidéo youtube - Guide
- Mas script - Accueil - Windows
- Ghost script - Télécharger - Polices de caractères
- Script cmd - Guide
- Script download - Télécharger - Édition & Programmation
12 réponses
essayez
cat /var/log/messages
ou
tail /var/log/messages (pour afficher uniquement les 10 dernières lignes)
cat /var/log/messages
ou
tail /var/log/messages (pour afficher uniquement les 10 dernières lignes)
Pour info (mais je l'apprends également à l'instant) ce fichier n'existe plus depuis 3 ans.
https://askubuntu.com/questions/51265/where-is-var-log-messages
En tout cas par rapport à mon problème le seul fichier de log qui se retrouve modifié lorsque je le requête http://localhost/cgi-bin/hello.cgi est le fichier /var/log/apache2/access.log qui n'a l'air d'indiquer que les requêtes, code HTTP et user-agent, exemple :
https://askubuntu.com/questions/51265/where-is-var-log-messages
En tout cas par rapport à mon problème le seul fichier de log qui se retrouve modifié lorsque je le requête http://localhost/cgi-bin/hello.cgi est le fichier /var/log/apache2/access.log qui n'a l'air d'indiquer que les requêtes, code HTTP et user-agent, exemple :
127.0.0.1 - - [21/Jun/2014:12:57:54 +0200] "GET /cgi-bin/hello.cgi HTTP/1.1" 404 505 "-" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1671.3 Safari/537.36"
Comment être sûr que cgi.load est bien pris en compte ? Je me demande s'il l'est bien.
Je viens de voir qu'une ligne "Include conf-available/serve-cgi-bin.conf" était commentée dans /etc/apache2/sites-available/000-default.conf. Je viens de la décommenter pour voir, mais un restart d'apache2 ne change toujours rien au problème.
Je viens de voir qu'une ligne "Include conf-available/serve-cgi-bin.conf" était commentée dans /etc/apache2/sites-available/000-default.conf. Je viens de la décommenter pour voir, mais un restart d'apache2 ne change toujours rien au problème.
Le problème est au niveau de votre script. Essayez ce code:
#!/bin/bash echo "Content-type: text/html" echo "" echo '<html>' echo '<head>' echo '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">' echo '<title>CGI page</title>' echo '</head>' echo '<body>' echo 'Hello world' echo '</body>' echo '</html>' exit 0
Merci de vous pencher également sur mon problème mais non le problème n'est pas son contenu car j'obtiens une page "404 Not Found" ; ce qui est décorrélé du contenu éventuellement renvoyé.
Je note d'ailleurs que cette proposition est strictement équivalente à la mienne. Le protocole HTTP n'oblige pas l'envoi de contenu HTML (et echo "" est équivalent à echo sans paramètre).
Tous les tuto cgi-bin que j'ai trouvé se limite également (mais souvent avec un script perl) au deux print (content type, double saut de ligne, un helloworld).
(Au cas où ça marcherait par magie, je l'ai quand même testé.)
Je note d'ailleurs que cette proposition est strictement équivalente à la mienne. Le protocole HTTP n'oblige pas l'envoi de contenu HTML (et echo "" est équivalent à echo sans paramètre).
Tous les tuto cgi-bin que j'ai trouvé se limite également (mais souvent avec un script perl) au deux print (content type, double saut de ligne, un helloworld).
(Au cas où ça marcherait par magie, je l'ai quand même testé.)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
J'abandonne mon idée de partir d'une installation par défaut d'Apache, je pensais que ce serait beaucoup plus simple.
Je viens de me coder un serveur HTTP minimal entièrement en bash (utilisant netcat) puisque mon besoin n'est que d'exécuter des commandes sur réception de requêtes HTTP.
Je viens de me coder un serveur HTTP minimal entièrement en bash (utilisant netcat) puisque mon besoin n'est que d'exécuter des commandes sur réception de requêtes HTTP.
Juste pour tester ajouter à /etc/apache2/apache2.conf
ScriptAlias /test/ /test/
<Directory /test/>
Options ExecCGI
AddHandler cgi-script cgi
</Directory>
creer le dossier test à la racine, y mettre hello.cgi puis
chmod 777 /test -R
redemarrer le serveur
acceder à http://localhost/test/hello.cgi
ScriptAlias /test/ /test/
<Directory /test/>
Options ExecCGI
AddHandler cgi-script cgi
</Directory>
creer le dossier test à la racine, y mettre hello.cgi puis
chmod 777 /test -R
redemarrer le serveur
acceder à http://localhost/test/hello.cgi
Ajouter:
Order allow,deny
Allow from all
</Directory>
Order allow,deny
Allow from all
</Directory>
idem 403 c'est peut-être une autre configuration pré-existante (par défaut) qui bloque (mais je ne connais pas). Voici donc son contenu (hors commentaires pour l'alléger) :
Mutex file:${APACHE_LOCK_DIR} default
PidFile ${APACHE_PID_FILE}
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
HostnameLookups Off
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf
Include ports.conf
<Directory />
Options FollowSymLinks
AllowOverride None
Require all denied
</Directory>
<Directory /usr/share>
AllowOverride None
Require all granted
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
AccessFileName .htaccess
<FilesMatch "^\.ht">
Require all denied
</FilesMatch>
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
IncludeOptional conf-enabled/*.conf
IncludeOptional sites-enabled/*.conf
ServerName localhost
ScriptAlias /test/ /test
<Directory /test/>
Options ExecCGI
AddHandler cgi-script cgi
Order allow,deny
Allow from all
</Directory>
Ah oui c'est ici:
<Directory />
Options FollowSymLinks
AllowOverride None
Require all denied
</Directory>
remplacer AllowOverride None par:
AllowOverride All
<Directory />
Options FollowSymLinks
AllowOverride None
Require all denied
</Directory>
remplacer AllowOverride None par:
AllowOverride All
Je viens de remarquer dans ce fichier de configuration qu'il inclut :
mods-enabled/*.load
mods-enabled/*.conf
conf-enabled/*.conf
et sites-enabled/*.conf
alors que cgi.load et alias.load sont dans mods-available.
Ne faudrait-il pas qu'ils soient inclus ? Si oui, en les déplaçant de mods-available vers mods-enabled ?
mods-enabled/*.load
mods-enabled/*.conf
conf-enabled/*.conf
et sites-enabled/*.conf
alors que cgi.load et alias.load sont dans mods-available.
Ne faudrait-il pas qu'ils soient inclus ? Si oui, en les déplaçant de mods-available vers mods-enabled ?
Ce qui signifie que les modules cgi et alias ne sont pas enabled
donc fait comme ci:
a2enmod alias
a2enmod cgi
restart apache
donc fait comme ci:
a2enmod alias
a2enmod cgi
restart apache
Je pense que vous utiliser la version 2.4 d'apache beaucoup de chose on changer
par exemple vous devez remplacer
Order allow,deny
Allow from all
par
Require all granted
Plus d'info ici:
http://httpd.apache.org/docs/2.4/fr/upgrading.html
par exemple vous devez remplacer
Order allow,deny
Allow from all
par
Require all granted
Plus d'info ici:
http://httpd.apache.org/docs/2.4/fr/upgrading.html
Comme j'ai installé ça hier c'est certainement la dernière ou en tout cas une très récente : Apache/2.4.7 (Ubuntu)
C'est l'impression que j'avais que beaucoup de choses ont changé car tous les tutos que j'ai pu trouver mentionne une configuration organisée différemment.
Ce nouveau remplacement n'a toujours pas permis l'affichage d'une page générée par le script.
Ce lien liste effectivement plein de modification mais je ne connaissais pas l'ancienne configuration non plus. Je connais juste quelques fonctionalités mais je ne sais pas faire toute une configuration (d'où mon idée initiale d'aller trouver quel est le dossier par défaut cgi-bin où placer mon script pour qu'il soit simplement exécuté).
Je vous remercie en tout cas pour votre implication, mais si mon idée n'est pas faisable simplement, autant que je reste avec mon server HTTP minimal codé en script shell (avec netcat).
C'est l'impression que j'avais que beaucoup de choses ont changé car tous les tutos que j'ai pu trouver mentionne une configuration organisée différemment.
Ce nouveau remplacement n'a toujours pas permis l'affichage d'une page générée par le script.
Ce lien liste effectivement plein de modification mais je ne connaissais pas l'ancienne configuration non plus. Je connais juste quelques fonctionalités mais je ne sais pas faire toute une configuration (d'où mon idée initiale d'aller trouver quel est le dossier par défaut cgi-bin où placer mon script pour qu'il soit simplement exécuté).
Je vous remercie en tout cas pour votre implication, mais si mon idée n'est pas faisable simplement, autant que je reste avec mon server HTTP minimal codé en script shell (avec netcat).
J'aurais dû mentionner que j'avais essayé, sans succès (du coup je n'ai pas pensé que c'était effectivement nécessaire) de :
- ajouter la ligne comme tu me dis dans /etc/apache2/conf-available/serve-cgi-bin.conf
- décommenter la ligne "AddHandler cgi-script .cgi" du fichier /etc/apache2/mods-available/mime.conf (mais le commentaire indique "To use CGI scripts outside of ScriptAliased directories")
- les deux à la fois
Je ne sais pas quel moyen fournit Apache2 pour comprendre ce qu'il se passe (ni comment). Est-ce qu'un log peut s'activer ? qui dirait pourquoi il affiche une page "404 Not Found" ? (histoire de savoir si c'est un problème de configuration de modules ou de droits ou que sais-je...)