CGI et HTML/PHP [Résolu]

Signaler
Messages postés
28
Date d'inscription
vendredi 1 juillet 2005
Statut
Membre
Dernière intervention
14 mai 2009
-
Messages postés
28
Date d'inscription
vendredi 1 juillet 2005
Statut
Membre
Dernière intervention
14 mai 2009
-
bonjour,
Excusez moi pour la rubrique, je ne savais vraiment pas ou poster cette question.

Mon probleme est le suivant: Je code en PHP et HTML en amateur et j'ai propose' a une amie de lui refaire son site web sans frames... ne me demander pas pourquoi, hehe

Tout va pour le mieux sauf pour son caddie CGI. J'ai une TRES vague ide'e du concept CGI et je patoge. Je pensais qu'en remplacant le fichier /cgi-bin dans le repertoire web du site et en y replacant un lien (les conditions sont les memes, j'ai juste enleve' les frames) cela marcherait, mais en lieux et place d'un caddie (quand je clique ajjouter au panier) le serveur me renvoie le fichier "dbshop.cgi" (ici) a downloader. (je precise que l'action du <FORM> qui envoie les donnees pointe sur ce meme fichier).

Etant donne'es que les <FORM> n'ont pas change's, que j'ai recopie' tel quel le repertoire CGI-BIN qu'il y avait sur le Cd contenant l'original de son site, ET que le caddie de son site fonctionnent dans la version frame, est-il possible de trouver ce qui ne fonctionne pas? Comme je n'ai aucune ide'e precise de la maniere dont fonctionne le CGI (bien que j'ai maintenant lu plusieurs tutoriaux...), je ne sais pas si l'on peut comme en Php trouver facilement d'ou peut venir l'erreur. 

Merci pour votre aide. S'il vous manque des elements pour me repondre, je suis a votre disposition.
RU.I
A voir également:

19 réponses

Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
16
Ah ben je suis bien content ! Je persiste à penser que tu peux te dispenser de l'utilisation d'un répertoire cgi-bin... M'enfin, c'est comme tu le sens.

Ravi d'avoir pu t'aider sur un sujet que je ne maîtrisais pas, et du coup, je te remercie également de l'avoir soumis, ça m'a permis d'apprendre des choses !

<hr size="2" width="100%" />Neige
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
16
Salut,

Je sais pas si j'ai la réponse, mais dans ton message, y'a des trucs qui m'interpellent...

CGI : Common Gateway Interface. Ce n'est pas un langage, ni une technologie... C'est une interface entre deux applicatifs. PHP peut fonctionne comme CGI, ou comme module d'Apache.
En tant que module Apache, le moteur PHP est intégré à Apache, comme un plugin quoi.
En tant que CGI, PHP est un programme exécutable externe auquel Apache transmet les requêtes afin qu'il les traite. Une fois fait, il renvoit à Apache le résultat de l'exécution du script.
C'est comme ça que fonctionne un CGI.

Un script CGI peut être écrit en Perl, en Python, en bash, en TCL, et j'en passe, le langage étant déterminé dans l'en-tête du fichier, un peu comme un script shell Linux (si je ne dis pas de bêtise).

Bref.

Il semble que, manifestement, le serveur de ton amie ait choisi de ne pas exécuter les scripts CGI et qu'au lieux de cela, il les propose au téléchargement. Inutile de préciser que c'est une faille de sécurité, hein, surtout si le fichier contient des mots de passe...

Bon alors puisque tu es à notre disposition si on manque d'éléments, je vais pas me gêner...
Tu dis que tu as le site sur un CD... Et tu le développes sur quoi ? Je veux dire dans quel environnement ? Quel serveur HTTP utilises-tu ?

Parce qu'en fait, tous les répertoires cgi-bin/ ne permettent pas d'exécuter des scripts CGI. Pire encore : quand on peut exécuter un script cgi dans un répertoire cgi-bin, on peut généralement le faire également dans d'autres répertoires. En fait, tout dépend de la configuration du serveur HTTP (Apache, IIS, Xitami, Netscape, etc).
Donc euh voilà pour le moment...

<hr size="2" width="100%" />Neige
Messages postés
28
Date d'inscription
vendredi 1 juillet 2005
Statut
Membre
Dernière intervention
14 mai 2009

Merci Neige pour ta reponse,

Je vais tente' de debroussailler un peu la situation aux vues de tes explications.

En gros elle a un site en HTML utilisant des frames et vraiment tres mal code's. Admettons que son site soit sur domain.com, son repertoire CGI est domain.com/cgi-bin/. C'est une supposition car je n'ai que le Cd du depart, je ne suis pas encore entre' sur son site actuel. Au final, je compte transferer son domaine sur mon serveur dedie' avec le meme domaine.

Mon serveur est en Apache/2.2.4 (Win32) mod_ssl/2.2.4 OpenSSL/0.9.8d PHP/5.2.3. Son serveur a elle, c'est un serveur partage' auquel je n'ai aucun acces pour le moment.

Si je comprends bien ce que tu dis, Apache n'executera les fichiers CGI sur le serveur que si ces fichiers sont dans un repertoire predefini ? Ce qui pousse donc Apache a me faire telecharger ce fichier "dbshop.cgi" ... Comment puis-je donc verifier quel repertoire sera capable d'executer un fichier CGI ? 

Merci pour ton aide, elle m'est precieuse.

RU.I
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
16
Re,

"Si je comprends bien ce que tu dis, Apache n'executera les fichiers CGI
sur le serveur que si ces fichiers sont dans un repertoire predefini ?
Ce qui pousse donc Apache a me faire telecharger ce fichier
"dbshop.cgi" ... Comment puis-je donc verifier quel repertoire sera
capable d'executer un fichier CGI ? "
Pas tout à fait. En fait, ça dépend vraiment de comment toi tu configures ton Apache.
Tu peux tout à fait le configurer pour exécuter les scripts CGI dans un répertoire bien spécifique. Mais tu peux aussi le configurer pour qu'il exécute tous les .cgi où qu'ils se trouvent, et pas forcément uniquement dans /cgi-bin/

Je ne me suis jamais penché vraiment sur la question, je n'ai que rarement eu l'occasion de rencontrer ce problème (une fois ou deux quand je faisais de la hotline serveur dédié, et encore, les problèmes auraient pu figurer dans une faq).
Je ne peux que t'encourager à lire la doc d'Apache 2.2 à ce sujet : http://httpd.apache.org/docs/2.2/howto/cgi.html (en anglais)
Mais si tu es sur Windows, tu vas t'amuser pour la configuration. Un script CGI (comme je viens d'en avoir la confirmation dans la doc d'Apache) défini le langage dans le script lui-même, de la même manière qu'un script exécutable en shell, c'est à dire avec une première ligne comme ça :
#!/usr/bin/perl

Il s'agit d'une ligne de commentaire prise en compte par le shell (ben oui, sous linux...) qui indique l'emplacement du programme tiers sur l'entrée standard duquel Apache renvoit la requête qu'il reçoit, dont il récupèrera le résultat sur la sortie standard.

Si le site de ton amie a été conçu pour être exploité sur une plateforme Linux, il n'est peut-être pas aisé de le porter sur une plateforme Windows.
Mes connaissances à ce niveau là ne vont pas plus loin que de simples spéculations... Je ne dis pas que c'est impossible, mais si c'est possible, ce ne sera sûrement pas évident à faire.
Je ne vais pas vraiment pouvoir t'aider pour ça. Il existe très certainement des forums vraiment spécialisés qui sauront mieux te guider que moi.
Pour le reste, n'hésite pas, je pense avoir quelques notions sur le fonctionnement d'un serveur...

Sur ce, deuxième tentative de dodo...

<hr size="2" width="100%" />Neige
Messages postés
28
Date d'inscription
vendredi 1 juillet 2005
Statut
Membre
Dernière intervention
14 mai 2009

Merci encore Neige pour tes explications. Moi je suis au Japon, c'est la journe'e ici, je n'ai pas vraiment pense' qu'il faisait nuit en France. Desole'


Apres avoir ecris mon commentaire, j'ai cherche' encore et je suis tombe' sur la page que tu viens de me soumettre. C'est une bonne documentation. J'ai l'habitude de rajouter des nouveaux domaines, subdomains etc sur mon serveur (pas vraiment que je comprenne ce que je fais mais une fois que tu le fais 2-3 fois c'est plutot simple), mais je suis jamais sorti de ces limites, a part peut etre pour installer un certificat SSL. Bref je suis pas vraiment sur de moi et je voudrais limiter la casse.

J'utilise comme tu peux t'en douter VirtualHost. je voudrais limiter la possibilite' d'utiliser le CGI sur un seul domaine, donc je suppose que plutot inserer les lignes qu'on suggere sur la doc Apache dans httpd.conf, c'est mieux de les mettre dans le fichier config des virtualHost a savoir httpd-vhosts.conf ?

j'ai une configuration qui ressemble a ca (dans ce meme fichier):

<VirtualHost *:80>
    ServerName domain.com
    ServerAlias domain.com *.domain.com
    ServerAdmin webmaster@domain.com
    DocumentRoot "d:/www/groupe/domain"
    <Directory "d:/www/groupe/domain">
        Options Indexes FollowSymLinks
        AllowOverride All
        Allow from all   
    </Directory>
    ErrorLog logs/domain-com-error_log
    CustomLog logs/domain-com-access_log common
</VirtualHost>

(Mon apache est sur c:/)
Mon repertoire cgi-bin se trouve dans d:/www/groupe/domain/cgi-bin/, est ce que c'est bien dans ces brackets <Directory> ci-dessus que je dois mettre mes lignes Options +ExecCGIetAddHandler cgi-script .cgi
?
Ou alors pour pouvoir restreindre comme je le disais l'execution des CGI au repertoire /cgi-bin/ faudrait t'il que je rajoute un nouveau bracket <directory> comme suit:

    <Directory "d:/www/groupe/domain">
         ...
    </Directory>

    <Directory "d:/www/groupe/domain/cgi-bin">
         Options +ExecCGI
         AddHandler cgi-script .cgi

    </Directory> 

Est ce que tout ca suffirait a "Configuring Apache to permit CGI" comme le dit la doc?

J'espere ne pas te prendre trop de temps, je suis vraiment content que tu puisses m'aider ainsi.

RU.I
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
16
Salut,

T'inquiète pas pour l'heure : je ne me sens nullement contraint de te répondre, je le fais parce que bon, c'est pour ça que je traine ici, même très tard le soir (notamment quand je n'arrive pas à dormir). Donc tu ne me prends pas de temps, j'ai à peu près que ça à faire ces temps-ci.

C'est donc bien dans la directive <Directory>  qu'il faut placer Options +ExecCGI. Cela permet de limiter l'exécution des CGI à ce répertoire. Tu peux aussi la placer dans la directive <VirtualHost> (au même niveau que <Directory> donc) pour permettre l'exécution des CGI sur tout le VirtualHost.
Quant à AddHandler, idem : il peut se placer à peu près n'importe où, notamment dans la directive <Directory> (c'est ce que dis la doc).

Par contre, je ne sais pas si sous Windows, Apache saura quoi faire avec cgi-script. Il se peut qu'il faille rajouter quelque part une directive Action, un peu comme pour PHP :
# Pour PHP 5
Action application/x-httpd-php "/php/php-cgi.exe"

Cette directive permet à Apache de savoir quoi faire quand il doit traiter un script PHP : il l'envoit à php-cgi.exe
Là, j'ai du mal à en dire plus...

<hr size="2" width="100%" />Neige
Messages postés
28
Date d'inscription
vendredi 1 juillet 2005
Statut
Membre
Dernière intervention
14 mai 2009

Merci pour ta reponse. Ca commence a s'eclaircir.

En gros, J'ai ouvert quelques fichiers et je vois qu'au debut du fichier dbshp.cgi j'ai #!/usr/local/bin/perl . Je suppose que ca veut dire que le script est ecrit en Perl, hors, j'ai pas Perl sur mon serveur.

Je pense donc essayer d'installer Perl sur le serveur mais j'ai aucune ide'e de la suite des evenements (j'espere pas trop que tout d'un coup ca marche apres l'installation).

Pour Options +ExecCGI et AddHandler cgi-script .cgi je l'ai fait j'ai obtenu un "500 Internal Server Error", et sur la doc d'apache ils disent de faire des trucs "below" et below il est rien ecrit, donc ?

RU.I
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
16
Plop,

J'ai trouvé ça qui a l'air pas mal :
http://www.thesitewizard.com/archive/addcgitoapache.shtml

Apparemment, pas besoin de Action, mais il faut modifier... tous les entêtes des scripts perl (là, un éditeur de texte qui les fait tous d'un coup, c'est pas mal).

Bon mais je vais trop vite... Il faut commencer par installer Perl sur le serveur. Evidemment. Dans sa version pour Windows. A priori, c'est trouvable ici : http://win32.perl.org

Ensuite, il faut donc modifier la première ligne des scripts Perl et remplacer
#!/usr/local/bin/perl

Par un truc comme :
#!c:/Program Files/perl/bin/perl.exe

Evidemment, ça dépend du chemin où est installé Perl, hein... Mais la première URL que je te donne doit bien expliquer avec plus de détails.
J'ai fait une recherche sur google avec "apache cgi perl windows", c'était le premier résultat... Y'en a pitetre d'autres...

<hr size="2" width="100%" />Neige
Messages postés
28
Date d'inscription
vendredi 1 juillet 2005
Statut
Membre
Dernière intervention
14 mai 2009

Entre temps on doit etre sur la meme longueur d'onde ... j'ai installe' ActivePerl sur mon serveur. Il est sur c:/perl/

Donc j'ai change' la premiere ligne du fichier cgi comme tu me l'as explique' (#!c:/perl/bin/perl.exe) et... ca marche pas. Lol

Donc je me penche sur mon httpd.conf, il semblerait qu'il faille le configurer pour Perl... je trouve beaucoup de Post sur les forums de gens uqi savent pas le configurer mais pas encore de solution (95% des posts dates de 2004... ouin)

RU.I
Messages postés
28
Date d'inscription
vendredi 1 juillet 2005
Statut
Membre
Dernière intervention
14 mai 2009

Cool, enfin un peu d'espoir, je viens de reussir a afficher http://localhost/cgi-bin/printenv.pl . Attention les yeux!! J'ai du changer l'entete la aussi mais soit. L'entete de printenv.pl c'est #!c:/perl/bin/perl.exe . De la comment reussir a lancer le script depuis d:/www/groupe/domain/cgi-bin/cart/dbshop.cgi .

D'apres mes faibles capacite's d'extrapolation en la matiere, je dirais que si en local depuis mon serveur le fichier printenv.pl dans c:/apache/cgi-bin/ fonctionnent et que dbshop.cgi fonctionne pas, c'est un probleme de configuration d'apache ?!

RU.I
Messages postés
28
Date d'inscription
vendredi 1 juillet 2005
Statut
Membre
Dernière intervention
14 mai 2009

J'ai essayer de mettre le dossier cart/ entier dans c:/apache/cgi-bin/ et de lancer http://localhost/cgi-bin/cart/dbshop.cgi mais j'ai encore une fois le Internal Server Error.

RU.I
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
16
Tu pourrais faire un petit récapitulatif de :
- La configuration du vhost (une copie de httpd.conf, juste la partie du vhost en question)
- Où se trouvent quels fichiers

Histoire que je me perde pas dans tous les messages... C'est que j'ai pas tes fichiers sous les yeux :)
J'essaie d'y voir clair, mais... Pfiou, j'ai vraiment pas assez dormi...

<hr size="2" width="100%" />Neige
Messages postés
28
Date d'inscription
vendredi 1 juillet 2005
Statut
Membre
Dernière intervention
14 mai 2009

Merci pour ton aide c'est vraiment cool de ta part.

Bon alors le httpd.conf:
httpd-vhosts.conf:
<VirtualHost *:80>
    ServerName domain.com
    ServerAlias domaindomaim.com
    ServerAdmin [mailto:webmaster@domain.com webmaster@domain.com]
    DocumentRoot "d:/www/groupe/domain"
    <Directory "d:/www/groupe/domain">
        Options +ExecCGI
        AddHandler cgi-script .cgi
        Options Indexes FollowSymLinks
        AllowOverride All
        Allow from all   
    </Directory>
    ErrorLog logs/domain-com-error_log
    CustomLog logs/domain-com-access_log common
</VirtualHost>

httpd.conf:
ServerRoot "C:/Apache"
LoadModule cgi_module modules/mod_cgi.so

    ScriptAlias /cgi-bin/ "C:/Apache/cgi-bin/"

<Directory "C:/Apache/cgi-bin">
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
</Directory>

    # AddHandler allows you to map certain file extensions to "handlers":
    # actions unrelated to filetype. These can be either built into the server
    # or added with the Action directive (see below)
    #
    # To use CGI scripts outside of ScriptAliased directories:
    # (You will also need to add "ExecCGI" to the "Options" directive.)
    #
    #AddHandler cgi-script .cgi

(Je te mets ce qui me semble avoir un rapport avec PERL ou le CGI)
--------------------------------------------------------------------------

Pour les fichiers,
Apache dans c:/apache/ (c:/apache/cgi-bin/)
Perl dans c:/perl/
et mes sites dans d:/www/groupe/domain/ (pour domain.com par exemple). Danc ce dernier j'ai d:/www/groupe/domain/cgi-bin/cart/dbshop.cgi (et d'autres fichiers *.pl)

Entre temps j'avais reussi a voir http://localhost/cgi-bin/printenv.pl et maintenant il me le repropose en download...

RU.I
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
16
AAAAAAAAAAAAAAAAAAAAAAAHHHHHHHHHHHHHHHHHHHHHHHHHHHH

Regarde :

    <Directory "d:/www/groupe/domain">
        Options +ExecCGI
        AddHandler cgi-script .cgi
        Options Indexes FollowSymLinks
        AllowOverride All
        Allow from all   
    </Directory>

D'abord, tu rajoutes ExecCGI aux options (utilisation du +). Ensuite, tu écrases TOUTES LES OPTIONS précédemment définies avec la ligne
Options Indexes FolloowSymlinks

Essaie de supprimer la première ligne Options, et rajoute + ExecCGI à la seconde...
<hr size="2" width="100%" />Neige
Messages postés
28
Date d'inscription
vendredi 1 juillet 2005
Statut
Membre
Dernière intervention
14 mai 2009

On va y arriver !

Bon alors j'ai :
    <Directory "d:/www/whisseliene/domain">
        AddHandler cgi-script .cgi
        Options Indexes FollowSymLinks +ExecCGI
        AllowOverride All
        Allow from all   
    </Directory>

Et maintenant la ou j'avais 500 Internal Server Error, maintenant j'ai :
Not Found
The requested URL /cgi-bin/cart/dbshop.cgi was not found on this server.

C'est deja ca!
Je le soupconne d'aller chercher cgi-bin/cart/dbshop.cgi dans c:/apache/cgi-bin/ ?!
?

RU.I
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
16
Ouaip... C'est probablement ça...
Puisque tu lui demandes l'URL /cgi-bin/.... et que dans httpd.conf il y a un alias défini /cgi-bin/ qui pointe vers ce répertoire...
En fait, j'ai jamais vraiment compris à quoi servait cet alias... Si ce n'est sur un hébergement mutualisé, pour que l'hébergeur laisse la possibilité à ses clients d'exécuter quelques cgi bien précis que l'hébergeur peut contrôler (et pas les clients), afin d'éviter des problèmes de sécurité.
Dans ton cas, je ne pense pas que ce soit utile...
Tu dois pouvoir te contenter de placer ton cgi dans le répertoire que tu veux et l'appeler depuis le web comme n'importe quel fichier/script, en utilisant l'URL du domaine + le chemin du script par rapport à la racine de publication.
En gros, place le à la racine de d:\www\groupe\domain\ et appelle le simplement avec http://www.domaine.com/script.cgi. Ca doit fonctionner...

<hr size="2" width="100%" />Neige
Messages postés
28
Date d'inscription
vendredi 1 juillet 2005
Statut
Membre
Dernière intervention
14 mai 2009

Okay, la on tient le bon bout! lol

J'ai placer le repertoire cart/ dans c:/apache/cgi-bin/ et comme par magie ca marche... mon caddie est enfin apparu!
Histoire de faire qqch de propre, j'aimerais quand meme ne pas placer ce cart/ dans mon repertoire Apache mais de le garder dans mon repertoire de site d:/www/groupe/domain/ .
Est ce que je pourrais pas utiliser :

    ScriptAlias /cgi-bin/ "C:/Apache/cgi-bin/"

ou tout simplement:
ScriptAlias /cgi-bin/ "d:/www/groupe/domain/cgi-bin/" ,

quelque part pour ca? Je sais pas si je dois rajouter ca au httpd.conf ou dans le <Directory> du Vhost de domain.com ?

-------------------------------------
Encore un autre probleme, tout a fait different, mais soit. Avant le fichier cgi renvoyait le caddie dans une frame de la page, donc ca allait, mais maintenant j'ai tout refait en PHP avec des includes et je vois pas vraiment comment bidouiller ca facilement ?

En fait mes pages se construisent automatiquement du style index.php -> <?php construct_page('index'); ?> et ma fonction construct_page va cherche les menus etc toutes seules plus la pages content_index.php (qui avant etait la frame centrale). Donc la quand j'apelle dbshop.cgi (avec un FORM), il me renvoie mon caddie correctement mais rien que mon caddie, j'ai plus ma structure ... J'avais pas pense' a ca :)

RU.I
Messages postés
28
Date d'inscription
vendredi 1 juillet 2005
Statut
Membre
Dernière intervention
14 mai 2009

J'ai reussi a deplacer mon contenu cgi-bin dans le repertoire du site en utilisant
ScriptAlias /cgi-bin/ "d:/www/groupe/domain/cgi-bin/" dans la config du site dans Vhost.

C'est excellent!

Encore mon probleme d'apel et de reception du resultat de dbshop.cgi dans Php et tout est regle'!

Merci vraiment pour tout ce que tu as fais pour moi!

RU.I
Messages postés
28
Date d'inscription
vendredi 1 juillet 2005
Statut
Membre
Dernière intervention
14 mai 2009

Pour ma part je suis aux anges! Franchement je pensais pas y arriver, j'etais presque sur le point de tout refaire en PHP (ce qui m'aurait pris au moins une semaine).

J'ai clique' plusieurs fois sur Reponse accepte'e! mais il semblerait qu'il y a un probleme dans la page, j'essaierai avec un autre Browser.

Pour le Repertoire CGI-BIN, tu veux dire que c'est mieux de placer les scripts dans le repertoire c:/apache/cgi-bin/ ? En fait, comme je le disais, j'ai encore le probleme du fichier cgi a inserer dans mes pages preconstruites PHP, donc je sais pas vraiment ce qu'il adviendra, je fais ma petite enquete, haha .

RU.I