CGI script : 404 not found

Fermé
bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 - Modifié par baladur13 le 21/06/2014 à 14:16
bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 - 21 juin 2014 à 18:34
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
<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:

12 réponses

zermat Messages postés 160 Date d'inscription jeudi 19 juin 2014 Statut Membre Dernière intervention 3 juin 2016 16
21 juin 2014 à 11:52
Ajoutez
AddHandler cgi-script .cgi
avant
</Directory>
0
bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 859
Modifié par bizu53 le 21/06/2014 à 12:31
Merci de cette réponse.
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...)
0
zermat Messages postés 160 Date d'inscription jeudi 19 juin 2014 Statut Membre Dernière intervention 3 juin 2016 16
21 juin 2014 à 12:46
essayez
cat /var/log/messages
ou
tail /var/log/messages (pour afficher uniquement les 10 dernières lignes)
0
bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 859
21 juin 2014 à 12:59
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 :
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"
0
bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 859
Modifié par bizu53 le 21/06/2014 à 13:16
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.
0
zermat Messages postés 160 Date d'inscription jeudi 19 juin 2014 Statut Membre Dernière intervention 3 juin 2016 16
21 juin 2014 à 13:13
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

0
bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 859
Modifié par bizu53 le 21/06/2014 à 13:32
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é.)
0
zermat Messages postés 160 Date d'inscription jeudi 19 juin 2014 Statut Membre Dernière intervention 3 juin 2016 16
21 juin 2014 à 14:31
ou peut être qu'apache ne trouve pas /bin/bash
0
bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 859
Modifié par bizu53 le 21/06/2014 à 14:47
Pourquoi ne le trouverait-il pas ? Je ne pense pas que le code d'erreur serait 404 mais un code dans les 50x dans ce cas : erreur interne.
J'ai la même page 404 Not Found pour un script perl (commençant par #!/usr/bin/perl).
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 859
21 juin 2014 à 14:58
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.
0
zermat Messages postés 160 Date d'inscription jeudi 19 juin 2014 Statut Membre Dernière intervention 3 juin 2016 16
21 juin 2014 à 15:15
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
0
bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 859
Modifié par bizu53 le 21/06/2014 à 16:11
C'est mieux.
Ce n'est plus une 404 Not Found mais une 403 Forbidden maintenant (You don't have permission to access /test/hello.cgi on this server.)
0
zermat Messages postés 160 Date d'inscription jeudi 19 juin 2014 Statut Membre Dernière intervention 3 juin 2016 16
21 juin 2014 à 16:29
Ajouter:

Order allow,deny
Allow from all
</Directory>
0
bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 859
Modifié par bizu53 le 21/06/2014 à 17:03
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>

0
zermat Messages postés 160 Date d'inscription jeudi 19 juin 2014 Statut Membre Dernière intervention 3 juin 2016 16
21 juin 2014 à 17:10
Ah oui c'est ici:
<Directory />
Options FollowSymLinks
AllowOverride None
Require all denied
</Directory>

remplacer AllowOverride None par:
AllowOverride All
0
bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 859
21 juin 2014 à 17:33
C'était effectivement sûrement à faire mais j'obtiens toujours un 403.
0
bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 859
Modifié par bizu53 le 21/06/2014 à 17:37
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 ?
0
zermat Messages postés 160 Date d'inscription jeudi 19 juin 2014 Statut Membre Dernière intervention 3 juin 2016 16
21 juin 2014 à 17:40
Ajouter :
Require all granted
au directory test
0
bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 859
Modifié par bizu53 le 21/06/2014 à 17:52
Toujours pas suffisant :p (403)
0
zermat Messages postés 160 Date d'inscription jeudi 19 juin 2014 Statut Membre Dernière intervention 3 juin 2016 16
21 juin 2014 à 17:54
Ce qui signifie que les modules cgi et alias ne sont pas enabled
donc fait comme ci:
a2enmod alias
a2enmod cgi

restart apache
0
bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 859
21 juin 2014 à 17:57
La première commande me dire qu'apparemment alias était déjà activée.
Mais la seconde a bien activé le module (d'après ce que ça dit).
0
bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 859
21 juin 2014 à 18:00
J'obtiens toujours une page 403 Forbidden.

Par curiosité je suis allé voir si mon original http://localhost/cgi-bin/hello.cgi fonctionnait, et je n'obtiens plus 404 Not Found mais 403 Forbidden également "maintenant" (je ne sais pas depuis quelle modif).
0
bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 859
21 juin 2014 à 18:01
J'aurais mieux fait de suivre entièrement un tuto pour créer un site avec CGI activé :p.
Je pensais sérieusement qu'il aurait été plus simple de simplement se servir de celui qui est fournit de base.
0
zermat Messages postés 160 Date d'inscription jeudi 19 juin 2014 Statut Membre Dernière intervention 3 juin 2016 16
Modifié par zermat le 21/06/2014 à 18:20
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
0
bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 859
21 juin 2014 à 18:34
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).
0